{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "5fec66cc",
   "metadata": {},
   "source": [
    "### 1.构图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "cb2423b9",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "import pandas as pd\n",
    "import networkx as nx\n",
    "from matplotlib.font_manager import FontProperties\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "f01649aa",
   "metadata": {},
   "outputs": [],
   "source": [
    "df = pd.read_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\1原始数据.xlsx')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "86789592",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(22209, 3)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Source</th>\n",
       "      <th>Target</th>\n",
       "      <th>weight</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>T0疫苗制备与组分创新技术</td>\n",
       "      <td>12.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S8寄生虫感染与免疫调控机制研究</td>\n",
       "      <td>T8疟疾疫苗抗原设计与开发</td>\n",
       "      <td>4.257620</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>S7自身免疫疾病发病机理探究</td>\n",
       "      <td>T1癌症免疫疗法肽类技术创新</td>\n",
       "      <td>2.726014</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>S4癌症免疫疗法原理与应用研究</td>\n",
       "      <td>T1癌症免疫疗法肽类技术创新</td>\n",
       "      <td>2.682281</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>S5结核病疫苗研发与免疫响应研究</td>\n",
       "      <td>T0疫苗制备与组分创新技术</td>\n",
       "      <td>2.556536</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             Source          Target     weight\n",
       "0   S0免疫响应与病毒感染机理研究   T0疫苗制备与组分创新技术  12.000000\n",
       "1  S8寄生虫感染与免疫调控机制研究   T8疟疾疫苗抗原设计与开发   4.257620\n",
       "2    S7自身免疫疾病发病机理探究  T1癌症免疫疗法肽类技术创新   2.726014\n",
       "3   S4癌症免疫疗法原理与应用研究  T1癌症免疫疗法肽类技术创新   2.682281\n",
       "4  S5结核病疫苗研发与免疫响应研究   T0疫苗制备与组分创新技术   2.556536"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(df.shape)\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "e11dc50c",
   "metadata": {},
   "outputs": [],
   "source": [
    "source = df['Source'].values\n",
    "target = df['Target'].values\n",
    "weight_ls = df['weight'].values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "489cde4e",
   "metadata": {},
   "outputs": [],
   "source": [
    "g = nx.Graph()\n",
    "for a in range(df.shape[0]):\n",
    "    organ1 = source[a]\n",
    "    organ2 = target[a]\n",
    "    weight = weight_ls[a]\n",
    "    g.add_edge(organ1,organ2,weight=weight)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "c6eccaab",
   "metadata": {},
   "outputs": [],
   "source": [
    "nx.write_pajek(g,r\"F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\2网络.net\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a629942f",
   "metadata": {},
   "source": [
    "### 2.1抽取已连接节点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "063fb038",
   "metadata": {},
   "outputs": [],
   "source": [
    "import random\n",
    "random.seed(2)\n",
    "from tqdm import tqdm\n",
    "import networkx as nx\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "1d73fae4",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "MultiGraph with 2136 nodes and 22209 edges\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\zhang\\AppData\\Local\\Temp\\ipykernel_15320\\3878527568.py:2: DeprecationWarning: info is deprecated and will be removed in version 3.0.\n",
      "\n",
      "  print(nx.info(G))\n"
     ]
    }
   ],
   "source": [
    "G = nx.read_pajek(r\"F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\2网络.net\")\n",
    "print(nx.info(G))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "e04bfd22",
   "metadata": {},
   "outputs": [],
   "source": [
    "fbb = pd.read_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\1原始数据.xlsx')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "f444f131",
   "metadata": {},
   "outputs": [],
   "source": [
    "fbb.columns = ['Node1','Node2','connect']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "c6b9ec26",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(22209, 3)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Node1</th>\n",
       "      <th>Node2</th>\n",
       "      <th>connect</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>T0疫苗制备与组分创新技术</td>\n",
       "      <td>12.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S8寄生虫感染与免疫调控机制研究</td>\n",
       "      <td>T8疟疾疫苗抗原设计与开发</td>\n",
       "      <td>4.257620</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>S7自身免疫疾病发病机理探究</td>\n",
       "      <td>T1癌症免疫疗法肽类技术创新</td>\n",
       "      <td>2.726014</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>S4癌症免疫疗法原理与应用研究</td>\n",
       "      <td>T1癌症免疫疗法肽类技术创新</td>\n",
       "      <td>2.682281</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>S5结核病疫苗研发与免疫响应研究</td>\n",
       "      <td>T0疫苗制备与组分创新技术</td>\n",
       "      <td>2.556536</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              Node1           Node2    connect\n",
       "0   S0免疫响应与病毒感染机理研究   T0疫苗制备与组分创新技术  12.000000\n",
       "1  S8寄生虫感染与免疫调控机制研究   T8疟疾疫苗抗原设计与开发   4.257620\n",
       "2    S7自身免疫疾病发病机理探究  T1癌症免疫疗法肽类技术创新   2.726014\n",
       "3   S4癌症免疫疗法原理与应用研究  T1癌症免疫疗法肽类技术创新   2.682281\n",
       "4  S5结核病疫苗研发与免疫响应研究   T0疫苗制备与组分创新技术   2.556536"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(fbb.shape)\n",
    "fbb.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "98c0b4aa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Node1</th>\n",
       "      <th>Node2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>T0疫苗制备与组分创新技术</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S8寄生虫感染与免疫调控机制研究</td>\n",
       "      <td>T8疟疾疫苗抗原设计与开发</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>S7自身免疫疾病发病机理探究</td>\n",
       "      <td>T1癌症免疫疗法肽类技术创新</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>S4癌症免疫疗法原理与应用研究</td>\n",
       "      <td>T1癌症免疫疗法肽类技术创新</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>S5结核病疫苗研发与免疫响应研究</td>\n",
       "      <td>T0疫苗制备与组分创新技术</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              Node1           Node2\n",
       "0   S0免疫响应与病毒感染机理研究   T0疫苗制备与组分创新技术\n",
       "1  S8寄生虫感染与免疫调控机制研究   T8疟疾疫苗抗原设计与开发\n",
       "2    S7自身免疫疾病发病机理探究  T1癌症免疫疗法肽类技术创新\n",
       "3   S4癌症免疫疗法原理与应用研究  T1癌症免疫疗法肽类技术创新\n",
       "4  S5结核病疫苗研发与免疫响应研究   T0疫苗制备与组分创新技术"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fb = fbb.iloc[:,[0,1]]\n",
    "fb.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "47ae899e",
   "metadata": {},
   "outputs": [],
   "source": [
    "fb_temp = fb.copy()\n",
    "removable_edges_indices = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "47748d4e",
   "metadata": {},
   "outputs": [],
   "source": [
    "# number of connected components and nodes of G\n",
    "ncc = nx.number_connected_components(g)\n",
    "number_of_nodes = len(g.nodes)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "1a883890",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2136"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "number_of_nodes"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "45b02abe",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "0e81908e",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|████████████████████████████████████████████████████████████████████████████| 22209/22209 [10:33<00:00, 35.04it/s]\n"
     ]
    }
   ],
   "source": [
    "# 对于每个节点对，我们将删除一个节点对并创建一个新的图，并检查连接组件的数量和节点的数量,与原始图形相同\n",
    "for i in tqdm(fb.index.values):\n",
    "    # 删除节点对并构建新图\n",
    "    G1 = nx.from_pandas_edgelist(fb_temp.drop(index= i), \"Node1\", \"Node2\",\n",
    "                                 create_using=nx.Graph())\n",
    "    # 如果连接组件的数量与原始组件的数量相同，图中我们不会删除边\n",
    "    if (nx.number_connected_components(G1) == ncc) and (len(G1.nodes) == number_of_nodes):\n",
    "        removable_edges_indices.append(i)\n",
    "         # 删除边，以便在下一次迭代中创建下一个G1，而不使用此边\n",
    "        fb_temp = fb_temp.drop(index = i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "7f1e0b83",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "20074"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(removable_edges_indices)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "112f1e54",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Node1</th>\n",
       "      <th>Node2</th>\n",
       "      <th>Connection</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>T0疫苗制备与组分创新技术</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S8寄生虫感染与免疫调控机制研究</td>\n",
       "      <td>T8疟疾疫苗抗原设计与开发</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>S7自身免疫疾病发病机理探究</td>\n",
       "      <td>T1癌症免疫疗法肽类技术创新</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>S4癌症免疫疗法原理与应用研究</td>\n",
       "      <td>T1癌症免疫疗法肽类技术创新</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>S5结核病疫苗研发与免疫响应研究</td>\n",
       "      <td>T0疫苗制备与组分创新技术</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "              Node1           Node2  Connection\n",
       "0   S0免疫响应与病毒感染机理研究   T0疫苗制备与组分创新技术           1\n",
       "1  S8寄生虫感染与免疫调控机制研究   T8疟疾疫苗抗原设计与开发           1\n",
       "2    S7自身免疫疾病发病机理探究  T1癌症免疫疗法肽类技术创新           1\n",
       "3   S4癌症免疫疗法原理与应用研究  T1癌症免疫疗法肽类技术创新           1\n",
       "4  S5结核病疫苗研发与免疫响应研究   T0疫苗制备与组分创新技术           1"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 获取fb数据帧中的节点对，索引位于removable_Edge_Index中 \n",
    "df2 = fb.loc[removable_edges_indices]\n",
    " \n",
    "# 创建列“连接”，并指定默认值1（连接节点）\n",
    "df2['Connection'] = 1\n",
    " \n",
    "df2.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "997b9bc5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(20074, 3)"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df2.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "d0cb9401",
   "metadata": {},
   "outputs": [],
   "source": [
    "df2.to_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\3可移动边_20074.xlsx',index = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "37821520",
   "metadata": {},
   "source": [
    "#### 2.2获取未连接节点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "6c35a8d5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2136, 2136)\n",
      "\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "matrix([[ 0.        , 12.        ,  0.        , ...,  1.03751871,\n",
       "          1.04321194,  0.        ],\n",
       "        [12.        ,  0.        ,  1.3785919 , ...,  0.        ,\n",
       "          0.        ,  1.00290731],\n",
       "        [ 0.        ,  1.3785919 ,  0.        , ...,  1.06191825,\n",
       "          0.        ,  0.        ],\n",
       "        ...,\n",
       "        [ 1.03751871,  0.        ,  1.06191825, ...,  0.        ,\n",
       "          0.        ,  0.        ],\n",
       "        [ 1.04321194,  0.        ,  0.        , ...,  0.        ,\n",
       "          0.        ,  0.        ],\n",
       "        [ 0.        ,  1.00290731,  0.        , ...,  0.        ,\n",
       "          0.        ,  0.        ]])"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# get a list of nodes in our graph\n",
    "l = list(g.nodes())\n",
    " \n",
    "# create adjacency matrix\n",
    "adj_G = nx.to_numpy_matrix(g, nodelist = l)\n",
    " \n",
    "print(str(adj_G.shape)+'\\n')\n",
    "adj_G"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "5c6374c9",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|█████████████████████████████████████████████████████████████████████████████| 2136/2136 [00:04<00:00, 488.75it/s]\n"
     ]
    }
   ],
   "source": [
    "# 获取所有没有边的节点对\n",
    "non_existing_edges = []\n",
    " \n",
    "# 遍历邻接矩阵\n",
    "offset = 0\n",
    "for i in tqdm(range(adj_G.shape[0])):\n",
    "    for j in range(offset,adj_G.shape[1]):\n",
    "        if i != j:\n",
    "            if adj_G[i,j] == 0:\n",
    "                non_existing_edges.extend([(l[i],l[j])])\n",
    "    offset = offset + 1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "c067bead",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2257971"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(non_existing_edges)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "9968427f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "2257971.0"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(2136*2135) / 2 - 22209"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3344cdba",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "296b3fca",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2257971, 3)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Node1</th>\n",
       "      <th>Node2</th>\n",
       "      <th>Connection</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>S8寄生虫感染与免疫调控机制研究</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>T8疟疾疫苗抗原设计与开发</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>S7自身免疫疾病发病机理探究</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>S4癌症免疫疗法原理与应用研究</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>S5结核病疫苗研发与免疫响应研究</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             Node1             Node2  Connection\n",
       "0  S0免疫响应与病毒感染机理研究  S8寄生虫感染与免疫调控机制研究           0\n",
       "1  S0免疫响应与病毒感染机理研究     T8疟疾疫苗抗原设计与开发           0\n",
       "2  S0免疫响应与病毒感染机理研究    S7自身免疫疾病发病机理探究           0\n",
       "3  S0免疫响应与病毒感染机理研究   S4癌症免疫疗法原理与应用研究           0\n",
       "4  S0免疫响应与病毒感染机理研究  S5结核病疫苗研发与免疫响应研究           0"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Non_Existing_Edges 的数据框\n",
    "\n",
    "df1_ = pd.DataFrame(data = non_existing_edges, columns =['Node1', 'Node2'])\n",
    " \n",
    "# create a column 'Connection' with default 0 (no-connection)\n",
    "df1_['Connection'] = 0\n",
    "print(df1_.shape)\n",
    "df1_.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "b16c8027",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Node1</th>\n",
       "      <th>Node2</th>\n",
       "      <th>Connection</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>S8寄生虫感染与免疫调控机制研究</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>T8疟疾疫苗抗原设计与开发</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>S7自身免疫疾病发病机理探究</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>S4癌症免疫疗法原理与应用研究</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>S5结核病疫苗研发与免疫响应研究</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2257966</th>\n",
       "      <td>the united state of america as represented by ...</td>\n",
       "      <td>广州大学_paper</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2257967</th>\n",
       "      <td>the united state of america as represented by ...</td>\n",
       "      <td>novartis vaccines institute for global health ...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2257968</th>\n",
       "      <td>广州市生物医药卫生研究院_paper_paper</td>\n",
       "      <td>广州大学_paper</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2257969</th>\n",
       "      <td>广州市生物医药卫生研究院_paper_paper</td>\n",
       "      <td>novartis vaccines institute for global health ...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2257970</th>\n",
       "      <td>广州大学_paper</td>\n",
       "      <td>novartis vaccines institute for global health ...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>2257971 rows × 3 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                     Node1  \\\n",
       "0                                          S0免疫响应与病毒感染机理研究   \n",
       "1                                          S0免疫响应与病毒感染机理研究   \n",
       "2                                          S0免疫响应与病毒感染机理研究   \n",
       "3                                          S0免疫响应与病毒感染机理研究   \n",
       "4                                          S0免疫响应与病毒感染机理研究   \n",
       "...                                                    ...   \n",
       "2257966  the united state of america as represented by ...   \n",
       "2257967  the united state of america as represented by ...   \n",
       "2257968                           广州市生物医药卫生研究院_paper_paper   \n",
       "2257969                           广州市生物医药卫生研究院_paper_paper   \n",
       "2257970                                         广州大学_paper   \n",
       "\n",
       "                                                     Node2  Connection  \n",
       "0                                         S8寄生虫感染与免疫调控机制研究           0  \n",
       "1                                            T8疟疾疫苗抗原设计与开发           0  \n",
       "2                                           S7自身免疫疾病发病机理探究           0  \n",
       "3                                          S4癌症免疫疗法原理与应用研究           0  \n",
       "4                                         S5结核病疫苗研发与免疫响应研究           0  \n",
       "...                                                    ...         ...  \n",
       "2257966                                         广州大学_paper           0  \n",
       "2257967  novartis vaccines institute for global health ...           0  \n",
       "2257968                                         广州大学_paper           0  \n",
       "2257969  novartis vaccines institute for global health ...           0  \n",
       "2257970  novartis vaccines institute for global health ...           0  \n",
       "\n",
       "[2257971 rows x 3 columns]"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "10fe9cd5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2257971, 3)"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1_.drop_duplicates(subset=['Node1','Node2']).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "75c9060b",
   "metadata": {},
   "outputs": [],
   "source": [
    "# # 没有重复\n",
    "# import pickle\n",
    "# with open(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\3未连接边2257971.pkl','wb') as f:\n",
    "#     pickle.dump(df1_,f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "cb14870d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2257971, 3)"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1_.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "673601af",
   "metadata": {},
   "outputs": [],
   "source": [
    "from tqdm import tqdm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "96f2452a",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|█████████████████████████████████████████████████████████████████████| 2257971/2257971 [00:38<00:00, 59144.03it/s]\n"
     ]
    }
   ],
   "source": [
    "# 筛选符合要求的未连接边\n",
    "idx_ls1 = []\n",
    "for i in tqdm(range(df1_.shape[0])):\n",
    "    node1 = df1_['Node1'].values[i]\n",
    "    node2 = df1_['Node2'].values[i]\n",
    "    if (node1.startswith('S')) & (node2.startswith('T')):\n",
    "        idx_ls1.append(i)\n",
    "    elif (node1.startswith('T')) & (node2.startswith('I')):\n",
    "        idx_ls1.append(i)\n",
    "    elif (node1.endswith('_paper')) & (node2.endswith('_patent')):\n",
    "        idx_ls1.append(i)\n",
    "    elif (node1.endswith('_patent')) & (node2.endswith('_product')):\n",
    "        idx_ls1.append(i)\n",
    "    elif (node1.endswith('_paper')) & (node2.startswith('S')):\n",
    "        idx_ls1.append(i)\n",
    "    elif (node1.endswith('_patent')) & (node2.startswith('I')):\n",
    "        idx_ls1.append(i)\n",
    "    elif (node1.endswith('_product')) & (node2.startswith('I')):\n",
    "        idx_ls1.append(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "54f81484",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "256710\n"
     ]
    }
   ],
   "source": [
    "print(len(idx_ls1))\n",
    "need_df1 = df1_.iloc[idx_ls1,:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "a9a88e84",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|█████████████████████████████████████████████████████████████████████| 2257971/2257971 [00:38<00:00, 59110.39it/s]\n"
     ]
    }
   ],
   "source": [
    "# 筛选符合要求的未连接边\n",
    "idx_ls2 = []\n",
    "for i in tqdm(range(df1_.shape[0])):\n",
    "    node1 = df1_['Node1'].values[i]\n",
    "    node2 = df1_['Node2'].values[i]\n",
    "    if (node2.startswith('S')) & (node1.startswith('T')):\n",
    "        idx_ls2.append(i)\n",
    "    elif (node2.startswith('T')) & (node1.startswith('I')):\n",
    "        idx_ls2.append(i)\n",
    "    elif (node2.endswith('_paper')) & (node1.endswith('_patent')):\n",
    "        idx_ls2.append(i)\n",
    "    elif (node2.endswith('_patent')) & (node1.endswith('_product')):\n",
    "        idx_ls2.append(i)\n",
    "    elif (node2.endswith('_paper')) & (node1.startswith('S')):\n",
    "        idx_ls2.append(i)\n",
    "    elif (node2.endswith('_patent')) & (node1.startswith('I')):\n",
    "        idx_ls2.append(i)\n",
    "    elif (node2.endswith('_product')) & (node1.startswith('I')):\n",
    "        idx_ls2.append(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "a668bb99",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "454691\n"
     ]
    }
   ],
   "source": [
    "print(len(idx_ls2))\n",
    "need_df2 = df1_.iloc[idx_ls2,:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "fadb7f8c",
   "metadata": {},
   "outputs": [],
   "source": [
    "need_df2_ = pd.DataFrame()\n",
    "need_df2_['Node1'] = need_df2['Node2']\n",
    "need_df2_['Node2'] = need_df2['Node1']\n",
    "need_df2_['Connection'] = need_df2['Connection']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "2e009f78",
   "metadata": {},
   "outputs": [],
   "source": [
    "need_df_all = pd.concat([need_df1.reset_index(drop = True),need_df2_.reset_index(drop = True)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "43a0e71a",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(711401, 3)"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "need_df_all.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "df1aecd3",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(711401, 3)"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "need_df_all.drop_duplicates(subset=['Node1','Node2']).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "fa1894ca",
   "metadata": {},
   "outputs": [],
   "source": [
    "# need_df_all.to_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\4带有前后顺序的未连接边714801.xlsx',index = False)\n",
    "# 没有重复\n",
    "# import pickle\n",
    "# with open(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\4带有前后顺序的未连接边711401.pkl','wb') as f:\n",
    "#     pickle.dump(need_df_all,f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b272032b",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "185f9724",
   "metadata": {},
   "outputs": [],
   "source": [
    "df1 = need_df_all.sample(n = 20074,replace = False, random_state = 521)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "9fbd781c",
   "metadata": {},
   "outputs": [],
   "source": [
    "df1.to_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\5未连接节点对_20074.xlsx',index = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "499f6168",
   "metadata": {},
   "source": [
    "#### 2.3子图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "3dec3a30",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\zhang\\AppData\\Local\\Temp\\ipykernel_15320\\1424061280.py:1: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.\n",
      "  DF = df1.append(df2[['Node1', 'Node2', 'Connection']],\n"
     ]
    }
   ],
   "source": [
    "DF = df1.append(df2[['Node1', 'Node2', 'Connection']],\n",
    "                ignore_index=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "6100f885",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(40148, 3)"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "df6d2823",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Node1</th>\n",
       "      <th>Node2</th>\n",
       "      <th>Connection</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>ciberesp_paper</td>\n",
       "      <td>the trustees of the university of pennsylvania...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>experimental therapeutics centre_paper</td>\n",
       "      <td>tokyo medical university_patent</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>呼吸疾病国家重点实验室_patent</td>\n",
       "      <td>bavarian nordic a/s_product</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>perth childrens hospital_paper</td>\n",
       "      <td>miami university_patent</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>institute nacional de recherche biomedical_paper</td>\n",
       "      <td>北京泰诺迪生物科技有限公司_patent</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                              Node1  \\\n",
       "0                                    ciberesp_paper   \n",
       "1            experimental therapeutics centre_paper   \n",
       "2                                呼吸疾病国家重点实验室_patent   \n",
       "3                    perth childrens hospital_paper   \n",
       "4  institute nacional de recherche biomedical_paper   \n",
       "\n",
       "                                               Node2  Connection  \n",
       "0  the trustees of the university of pennsylvania...           0  \n",
       "1                    tokyo medical university_patent           0  \n",
       "2                        bavarian nordic a/s_product           0  \n",
       "3                            miami university_patent           0  \n",
       "4                               北京泰诺迪生物科技有限公司_patent           0  "
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "DF.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "87525853",
   "metadata": {},
   "outputs": [],
   "source": [
    "DF.to_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\6正样本-负样本-40148.xlsx',index = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "6dd62cbe",
   "metadata": {},
   "outputs": [],
   "source": [
    "df3 = fb.drop(index=df2.index.values)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "0c3c949f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(2135, 2)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Node1</th>\n",
       "      <th>Node2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>55</th>\n",
       "      <td>T28轮状病毒疫苗低剂量配方创新</td>\n",
       "      <td>I26轮状病毒疫苗</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>129</th>\n",
       "      <td>T0疫苗制备与组分创新技术</td>\n",
       "      <td>I17过敏疫苗</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>464</th>\n",
       "      <td>东海大学_paper</td>\n",
       "      <td>国立中兴大学_patent</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>819</th>\n",
       "      <td>屯门医院_paper</td>\n",
       "      <td>香港大学_patent</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1097</th>\n",
       "      <td>贵州大学_paper</td>\n",
       "      <td>江苏省农业科学院_patent</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                 Node1            Node2\n",
       "55    T28轮状病毒疫苗低剂量配方创新        I26轮状病毒疫苗\n",
       "129      T0疫苗制备与组分创新技术          I17过敏疫苗\n",
       "464         东海大学_paper    国立中兴大学_patent\n",
       "819         屯门医院_paper      香港大学_patent\n",
       "1097        贵州大学_paper  江苏省农业科学院_patent"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 从现有连接中删除了可以移动的边，可视为子图（以前可能存在的图）\n",
    "print(df3.shape)\n",
    "df3.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "a789aacb",
   "metadata": {},
   "outputs": [],
   "source": [
    "df3.to_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\7子图连边2135.xlsx',index = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "68bed0e9",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Graph with 2136 nodes and 2135 edges\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\zhang\\AppData\\Local\\Temp\\ipykernel_15320\\189768593.py:5: DeprecationWarning: info is deprecated and will be removed in version 3.0.\n",
      "\n",
      "  print(nx.info(G_new))\n"
     ]
    }
   ],
   "source": [
    "# 仍然是2136个点\n",
    "G_new = nx.from_pandas_edgelist(df3, \"Node1\", \"Node2\",\n",
    "                               create_using=nx.Graph())\n",
    "\n",
    "print(nx.info(G_new))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "8ab22ea7",
   "metadata": {},
   "outputs": [],
   "source": [
    "nx.write_pajek(G_new,r\"F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\8G_new.net\")"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bddb0438",
   "metadata": {},
   "source": [
    "#### 2.4使用 Node2Vec 生成特征 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "f62dff5a",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pickle"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "9158e335",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "4ce080bc4f544afda2434671349ba11a",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Computing transition probabilities:   0%|          | 0/2136 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Generating walks (CPU: 1): 100%|███████████████████████████████████████████████████████| 50/50 [00:33<00:00,  1.48it/s]\n"
     ]
    }
   ],
   "source": [
    "from node2vec import Node2Vec\n",
    " \n",
    "# Generating walks\n",
    "node2vec = Node2Vec(G_new, dimensions=100, walk_length=16, num_walks=50)\n",
    " \n",
    "# training the node2vec model\n",
    "n2v_model = node2vec.fit(window=7, min_count=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "c9b54139",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\9node2vec_model.pkl','wb') as f:\n",
    "    pickle.dump(n2v_model,f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "ae00ad97",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 为df1的节点对(边)获取特征\n",
    "edge_features = [(n2v_model.wv[str(i)]+n2v_model.wv[str(j)]) for i,j in zip(DF['Node1'], DF['Node2'])]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "cfa8848f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "40148"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(edge_features)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "67a1ac16",
   "metadata": {},
   "outputs": [],
   "source": [
    "data = pd.concat([DF,pd.DataFrame(edge_features)],axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "acc636b8",
   "metadata": {},
   "outputs": [],
   "source": [
    "data.to_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\10类别—特征.xlsx',index = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "847d57b5",
   "metadata": {},
   "source": [
    "### 3.数据集划分"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "6d387111",
   "metadata": {},
   "outputs": [],
   "source": [
    "data = pd.read_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\10类别—特征.xlsx')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "137b3f0e",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(40148, 103)\n"
     ]
    },
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Node1</th>\n",
       "      <th>Node2</th>\n",
       "      <th>Connection</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>...</th>\n",
       "      <th>90</th>\n",
       "      <th>91</th>\n",
       "      <th>92</th>\n",
       "      <th>93</th>\n",
       "      <th>94</th>\n",
       "      <th>95</th>\n",
       "      <th>96</th>\n",
       "      <th>97</th>\n",
       "      <th>98</th>\n",
       "      <th>99</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>ciberesp_paper</td>\n",
       "      <td>the trustees of the university of pennsylvania...</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.984398</td>\n",
       "      <td>0.355324</td>\n",
       "      <td>0.583585</td>\n",
       "      <td>0.015642</td>\n",
       "      <td>0.604310</td>\n",
       "      <td>-0.737822</td>\n",
       "      <td>0.330185</td>\n",
       "      <td>...</td>\n",
       "      <td>1.062625</td>\n",
       "      <td>0.001874</td>\n",
       "      <td>1.066443</td>\n",
       "      <td>0.509784</td>\n",
       "      <td>0.356756</td>\n",
       "      <td>0.442041</td>\n",
       "      <td>-0.193761</td>\n",
       "      <td>-0.429044</td>\n",
       "      <td>-0.304055</td>\n",
       "      <td>0.512413</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>experimental therapeutics centre_paper</td>\n",
       "      <td>tokyo medical university_patent</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.164184</td>\n",
       "      <td>0.667107</td>\n",
       "      <td>0.422885</td>\n",
       "      <td>0.070065</td>\n",
       "      <td>0.370435</td>\n",
       "      <td>-0.513606</td>\n",
       "      <td>0.229427</td>\n",
       "      <td>...</td>\n",
       "      <td>0.381383</td>\n",
       "      <td>0.489913</td>\n",
       "      <td>0.459092</td>\n",
       "      <td>0.403358</td>\n",
       "      <td>1.256482</td>\n",
       "      <td>0.647604</td>\n",
       "      <td>-0.588304</td>\n",
       "      <td>-0.011904</td>\n",
       "      <td>0.097212</td>\n",
       "      <td>0.169729</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>呼吸疾病国家重点实验室_patent</td>\n",
       "      <td>bavarian nordic a/s_product</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.018161</td>\n",
       "      <td>0.995507</td>\n",
       "      <td>0.265244</td>\n",
       "      <td>-0.475754</td>\n",
       "      <td>0.648463</td>\n",
       "      <td>-0.594213</td>\n",
       "      <td>0.211178</td>\n",
       "      <td>...</td>\n",
       "      <td>0.415351</td>\n",
       "      <td>0.534056</td>\n",
       "      <td>0.620509</td>\n",
       "      <td>1.143828</td>\n",
       "      <td>1.269591</td>\n",
       "      <td>1.106737</td>\n",
       "      <td>0.424864</td>\n",
       "      <td>-0.641806</td>\n",
       "      <td>0.491701</td>\n",
       "      <td>0.430583</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>perth childrens hospital_paper</td>\n",
       "      <td>miami university_patent</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.407162</td>\n",
       "      <td>0.350534</td>\n",
       "      <td>0.319204</td>\n",
       "      <td>-0.119692</td>\n",
       "      <td>0.958141</td>\n",
       "      <td>-0.102459</td>\n",
       "      <td>0.408996</td>\n",
       "      <td>...</td>\n",
       "      <td>0.608432</td>\n",
       "      <td>0.100594</td>\n",
       "      <td>0.356628</td>\n",
       "      <td>0.374596</td>\n",
       "      <td>0.306980</td>\n",
       "      <td>0.675469</td>\n",
       "      <td>0.049944</td>\n",
       "      <td>-0.362173</td>\n",
       "      <td>0.351323</td>\n",
       "      <td>0.106979</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>institute nacional de recherche biomedical_paper</td>\n",
       "      <td>北京泰诺迪生物科技有限公司_patent</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.083898</td>\n",
       "      <td>0.839808</td>\n",
       "      <td>-0.016593</td>\n",
       "      <td>-0.157393</td>\n",
       "      <td>0.957958</td>\n",
       "      <td>-0.311843</td>\n",
       "      <td>0.348180</td>\n",
       "      <td>...</td>\n",
       "      <td>0.532102</td>\n",
       "      <td>-0.025207</td>\n",
       "      <td>1.205342</td>\n",
       "      <td>0.474659</td>\n",
       "      <td>1.048894</td>\n",
       "      <td>0.597363</td>\n",
       "      <td>-0.008909</td>\n",
       "      <td>0.047450</td>\n",
       "      <td>0.461840</td>\n",
       "      <td>-0.003629</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 103 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                                              Node1  \\\n",
       "0                                    ciberesp_paper   \n",
       "1            experimental therapeutics centre_paper   \n",
       "2                                呼吸疾病国家重点实验室_patent   \n",
       "3                    perth childrens hospital_paper   \n",
       "4  institute nacional de recherche biomedical_paper   \n",
       "\n",
       "                                               Node2  Connection         0  \\\n",
       "0  the trustees of the university of pennsylvania...           0 -0.984398   \n",
       "1                    tokyo medical university_patent           0 -0.164184   \n",
       "2                        bavarian nordic a/s_product           0 -1.018161   \n",
       "3                            miami university_patent           0 -0.407162   \n",
       "4                               北京泰诺迪生物科技有限公司_patent           0 -1.083898   \n",
       "\n",
       "          1         2         3         4         5         6  ...        90  \\\n",
       "0  0.355324  0.583585  0.015642  0.604310 -0.737822  0.330185  ...  1.062625   \n",
       "1  0.667107  0.422885  0.070065  0.370435 -0.513606  0.229427  ...  0.381383   \n",
       "2  0.995507  0.265244 -0.475754  0.648463 -0.594213  0.211178  ...  0.415351   \n",
       "3  0.350534  0.319204 -0.119692  0.958141 -0.102459  0.408996  ...  0.608432   \n",
       "4  0.839808 -0.016593 -0.157393  0.957958 -0.311843  0.348180  ...  0.532102   \n",
       "\n",
       "         91        92        93        94        95        96        97  \\\n",
       "0  0.001874  1.066443  0.509784  0.356756  0.442041 -0.193761 -0.429044   \n",
       "1  0.489913  0.459092  0.403358  1.256482  0.647604 -0.588304 -0.011904   \n",
       "2  0.534056  0.620509  1.143828  1.269591  1.106737  0.424864 -0.641806   \n",
       "3  0.100594  0.356628  0.374596  0.306980  0.675469  0.049944 -0.362173   \n",
       "4 -0.025207  1.205342  0.474659  1.048894  0.597363 -0.008909  0.047450   \n",
       "\n",
       "         98        99  \n",
       "0 -0.304055  0.512413  \n",
       "1  0.097212  0.169729  \n",
       "2  0.491701  0.430583  \n",
       "3  0.351323  0.106979  \n",
       "4  0.461840 -0.003629  \n",
       "\n",
       "[5 rows x 103 columns]"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(data.shape)\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "337bbc6f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "28103.6"
      ]
     },
     "execution_count": 81,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "40148*0.7"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "id": "d933a512",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0    14130\n",
       "1    13973\n",
       "Name: Connection, dtype: int64"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train = data.sample(n=28103,random_state=1)\n",
    "train['Connection'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "id": "8762ad9c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "12045"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "40148-28103"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "id": "aea7b7e0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1    6101\n",
       "0    5944\n",
       "Name: Connection, dtype: int64"
      ]
     },
     "execution_count": 85,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test = data.drop(index=train.index)\n",
    "test['Connection'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "id": "8befefda",
   "metadata": {},
   "outputs": [],
   "source": [
    "train.to_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\11train_28103.xlsx',index = False)\n",
    "test.to_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\11test_12045.xlsx',index = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b34374e",
   "metadata": {},
   "source": [
    "### 4.构建分类模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "8a0bece0",
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "from sklearn.metrics import confusion_matrix\n",
    "from sklearn.metrics import precision_recall_fscore_support\n",
    "from sklearn.model_selection import cross_val_score\n",
    "import numpy as np\n",
    "from tqdm import tqdm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "60793126",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "train = pd.read_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\11train_28103.xlsx')\n",
    "val = pd.read_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\11test_12045.xlsx')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "56a9fcee",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "Index([     'Node1',      'Node2', 'Connection',            0,            1,\n",
       "                  2,            3,            4,            5,            6,\n",
       "       ...\n",
       "                 90,           91,           92,           93,           94,\n",
       "                 95,           96,           97,           98,           99],\n",
       "      dtype='object', length=103)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "dae1851b",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.preprocessing import LabelEncoder\n",
    "labelEncoder = LabelEncoder()\n",
    "\n",
    "train_y = labelEncoder.fit_transform(train['Connection'])\n",
    "val_y = labelEncoder.fit_transform(val['Connection'])\n",
    "# test_y = labelEncoder.fit_transform(test['影响力类别3'])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "441730e5",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 原始特征-标签\n",
    "train_X = train.iloc[:,3:]\n",
    "val_X = val.iloc[:,3:]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e38f66b0",
   "metadata": {},
   "source": [
    "### 4.1SVM"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "0b107b17",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.svm import SVC \n",
    "kernel_list = ['linear', 'poly', 'rbf', 'sigmoid']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 212,
   "id": "c165e183",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████████████████████| 4/4 [12:58<00:00, 194.74s/it]\n"
     ]
    }
   ],
   "source": [
    "# 10折交叉验证  kernel\n",
    "train_score_ls = []\n",
    "val_score_ls = []\n",
    "\n",
    "for kernel in tqdm(kernel_list):\n",
    "    model = SVC(kernel=kernel,random_state=0)\n",
    "    model = model.fit(train_X,train_y)\n",
    "    train_score_ls.append(model.score(train_X,train_y))\n",
    "    val_score_ls.append(model.score(val_X,val_y))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 214,
   "id": "06095740",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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kSNHnK9//fXX9OjRg1q1alG3bl1uv/12fv/9d+fr+/btw2Qy8dFHH3HjjTfi7+/Pv//9b4+/V7nybrzxRh599FEeffRR53h47rnnnP+bOn78OMOGDaN27doEBgbSt29f9uzZU2xf+/btw2w2s3nzZpf22bNnExERUWH+hybeUTjW4uLiqFevHn369AEcN3Tt27cvAQEBNGnShI8//ti5j8lkYsuWLUyZMgWTycQLL7zgperFE/7zn//QoUMHAgICqFu3Lr179+b06dNFTl2dPHmS+++/n6CgIOrXr8/rr7/ucokHOH5XTp06lWHDhhEcHExERASfffYZf/75J3feeSfBwcF06NChyM+npUuX0q5dO6xWK5GRkbz22msur1/4O3jPnj306tULf39/2rZtS0JCQqneu4LOZUyePJlBgwbx008/0a9fP+6//36OHTsGOH5o3HDDDXTq1InNmzfz9ddfc/jwYQYNGuTc//Tp08TFxfHDDz/wzTffYDabueuuu7Db7S7HeeaZZ3j88cdJTk7mlltuuaLvUa6chQsX4uPjw8aNG3njjTd4/fXXmTdvHuA4V75582Y+//xz1q9fj2EY9OvXD5vNVqSfyMhIevfuzbvvvuvS/u677zJ8+PByXbRWKqfCsbZ27VrefvttAJ5//nn+53/+h+3bt/PAAw8wZMgQkpOTAcfPs3bt2vHkk0+SlpbGU0895c3ypRylpaUxZMgQRo4cSXJyMt9//z133313sf8hiouLY+3atXz++eckJCSQlJTEjz/+WGS7119/nZiYGLZu3cptt93G0KFDGTZsGA888AA//vgjzZs3Z9iwYc5jbNmyhUGDBnHvvffy888/88ILL/D888+zYMGCYmu22+3cfffdWCwWNmzYwP/93//xzDPPlO4PwKjmbrjhBuOJJ54wDMMwIiIijNdff935GmA899xzzuenTp0yTCaT8dVXXxmGYRjPP/+8ERsb69Lf/v37DcDYtWtXscfLyMgwAOPnn382DMMw9u7dawDGzJkzy/FdSUV0ww03GG3atDHsdruz7ZlnnjHatGlj7N692wCMtWvXOl87cuSIERAQYHz00UeGYRjGu+++a4SEhDhfX7JkiVG7dm3j7NmzhmEYxrZt2wyTyWTs3bv3irwfqbhuuOEGo1OnTi5tgDF27FiXtq5duxoPP/yw83nHjh2Nf/zjH1eiRLmCtmzZYgDGvn37irz24IMPGnfeeadhGIaRlZVl+Pr6Gh9//LHz9RMnThiBgYHO35OG4fhd+cADDzifp6WlGYDx/PPPO9vWr19vAEZaWpphGIZx3333GX369HE59tNPP220bdvWpd/C38ErVqwwLBaLsX//fufrX331lQEYy5Ytc+v9a0bnMq655hrn90FBQdSoUYOMjAzAkVC/++47goODnY/WrVsDOE9P/f7779x33300bdqUmjVr0qRJEwCX9cAAOnfufCXejnhZt27dXGZbunfvzp49e9i5cyc+Pj4u67vVrVuXVq1aOf/HfaEBAwbg4+PDsmXLAJg/fz5/+ctfiIyM9Oh7kMqhuJ8p3bt3L/L8YuNLqo6OHTty880306FDB+655x7mzp3L8ePHi2yXkpKCzWajS5cuzraQkBBatWpVZNvzfzeGhoYC0KFDhyJthb8vk5OTiYmJcekjJiaGPXv2kJ+fX6T/5ORkGjduTKNGjZxtF47fklLQuYwLLwo2mUzO0052u53+/fuzbds2l0fheUWA/v37c/ToUebOncvGjRvZuHEjUPTiQH3aS4pjGMZFT0P5+fkxdOhQ3n33XXJzc/nggw8YOXLkFa5QKqqS/kzRac6qz2KxkJCQwFdffUXbtm2ZPXs2rVq1Yu/evS7bGQWnmS4cE0Yxp7jO/91YuH1xbYW/L4v7WVZcv5d6rbRjVUGnDK677jp27NhBZGQkzZs3d3kEBQVx9OhRkpOTee6557j55ptp06ZNsSlaqo8NGzYUed6iRQvatm1LXl6eMwgDHD16lN27d9OmTZuL9jd69GhWrVrFnDlzsNls3H333R6rXSq/4sZf4Sy0VG0mk4mYmBgmT57M1q1b8fPzc84GF2rWrBm+vr5s2rTJ2ZaVlXXRD0W4o23btqxZs8albd26dbRs2RKLxVLs9qmpqRw6dMjZtn79+lIdW0GnDB555BGOHTvGkCFD2LRpEykpKaxcuZKRI0eSn59P7dq1qVu3Lu+88w6//fYb3377LXFxcd4uW7xo//79xMXFsWvXLj788ENmz57NE088QYsWLbjzzjt56KGHWLNmjfNi0YYNG3LnnXdetL82bdrQrVs3nnnmGYYMGUJAQMAVfDdS2Xz88cfMnz+f3bt3849//INNmzbx6KOPerss8bCNGzfy0ksvsXnzZlJTU/nkk0/4888/i/wnqkaNGjz44IM8/fTTfPfdd+zYsYORI0diNpvLPPP35JNP8s033/Diiy+ye/duFi5cyJtvvnnRi9579+5Nq1atGDZsGNu3bycpKYlJkyaV6tgKOmXQoEED1q5dS35+Prfccgvt27fniSeeICQkBLPZjNlsZvHixWzZsoX27dszYcIEXn31VW+XLV40bNgwzpw5Q5cuXXjkkUd47LHHGDNmDOD4xFRUVBS333473bt3xzAMli9fftl7Ko0aNYrc3FydtpLLmjx5MosXL+aaa65h4cKFLFq0iLZt23q7LPGwmjVrkpiYSL9+/WjZsiXPPfccr732Gn379i2y7YwZM+jevTu33347vXv3JiYmhjZt2uDv71+mGq677jo++ugjFi9eTPv27fn73//OlClTGD58eLHbm81mli1bRk5ODl26dGH06NH885//LNWxTcalTpKJSLm58cYb6dSpU7kvM/LPf/6TxYsX8/PPP5drvyIip0+fpmHDhrz22muMGjXK2+WUiu6MLFJJnTp1iuTkZGbPns2LL77o7XJEpArYunUrv/76K126dCEzM5MpU6YAXPIUekWnU1cildSjjz5Kjx49uOGGG3TaSkTKzfTp0+nYsaPz7slJSUnUq1fP22WVmk5diYiISJWlGR0RERGpshR0REREpMpS0BEREZEqS0FHREREqiwFHREREamyFHRERESkylLQERERkSpLQUdERESqLAUdERERqbL+P9ZZ0YYdx36qAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(kernel_list,train_score_ls,label = 'train') # 训练\n",
    "plt.plot(kernel_list,val_score_ls,label = 'val') # 验证\n",
    "plt.legend()\n",
    "plt.grid()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "9ef1f15f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7909506019095061"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 参数确定，计算acc\n",
    "model = SVC(kernel='poly',random_state=0)\n",
    "\n",
    "model.fit(train_X,train_y) \n",
    "score_r = model.score(val_X,val_y)\n",
    "score_r"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "4046e18e",
   "metadata": {},
   "outputs": [],
   "source": [
    "p, r, f1, s = precision_recall_fscore_support(val_y.reshape(-1, 1), model.predict(val_X))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "209528ec",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>P</th>\n",
       "      <th>r</th>\n",
       "      <th>f1</th>\n",
       "      <th>S</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.732618</td>\n",
       "      <td>0.907638</td>\n",
       "      <td>0.810791</td>\n",
       "      <td>5944</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.882717</td>\n",
       "      <td>0.677266</td>\n",
       "      <td>0.766463</td>\n",
       "      <td>6101</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          P         r        f1     S\n",
       "0  0.732618  0.907638  0.810791  5944\n",
       "1  0.882717  0.677266  0.766463  6101"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pd.DataFrame({'P':p, 'r':r, 'f1':f1, 'S':s})"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "377e3301",
   "metadata": {},
   "source": [
    "### 4.2LogisticRegression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "id": "69e73535",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.linear_model import LogisticRegression"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "id": "f4487675",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████████████████████████████████████████████████████████████████████████████| 20/20 [20:00<00:00, 60.03s/it]\n"
     ]
    }
   ],
   "source": [
    "# 调节参数\n",
    "train_score_ls = []\n",
    "val_score_ls = []\n",
    "test_score_ls = []\n",
    "for i in tqdm(np.linspace(0.01,1,20)):\n",
    "    model = LogisticRegression(random_state=0\n",
    "                               ,penalty='l1',solver=\"liblinear\",C=i,max_iter=1000\n",
    "                              )\n",
    "    \n",
    "    model = model.fit(train_X,train_y)\n",
    "    train_score_ls.append(model.score(train_X,train_y))\n",
    "    val_score_ls.append(model.score(val_X,val_y))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "id": "6ea9abe8",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjUAAAGdCAYAAADqsoKGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy88F64QAAAACXBIWXMAAA9hAAAPYQGoP6dpAABRt0lEQVR4nO3deXxV1b3//9eZMpOEQAhTmEGGMAmC4FBtMSoWxVacWr5isV61/VXKtS1cpAhflVYrhfYWb/UbRVutVMGhNhZyrSKIiiAikwIiQ0IgJEDm4Qz798fOQMicnDnv5+NxHjlnn332/mSBnjdrrb22xTAMAxEREZEQZw10ASIiIiLeoFAjIiIiYUGhRkRERMKCQo2IiIiEBYUaERERCQsKNSIiIhIWFGpEREQkLCjUiIiISFiwB7oAf/J4PJw4cYIuXbpgsVgCXY6IiIi0gmEYFBcX07t3b6zWpvtjOlWoOXHiBKmpqYEuQ0RERNrh+PHj9O3bt8n3O1Wo6dKlC2A2Snx8fLuP43Q62bhxI+np6TgcDm+VJ41QW/uP2tp/1Nb+o7b2H1+2dVFREampqbXf403pVKGmZsgpPj6+w6EmJiaG+Ph4/UfiY2pr/1Fb+4/a2n/U1v7jj7ZuaeqIJgqLiIhIWFCoERERkbCgUCMiIiJhoVPNqWkNt9uN0+lsdh+n04ndbqeiogK32+2nyoKfzWbDbrfrcnkREQkIhZrzlJSUkJ2djWEYze5nGAY9e/bk+PHj+gK/QExMDL169SIiIiLQpYiISCejUFPN7XaTnZ1NTEwMycnJzYYVj8dDSUkJcXFxzS4C1JkYhkFVVRWnT5/mm2++YejQoWobERHxK4Waak6nE8MwSE5OJjo6utl9PR4PVVVVREVF6Yv7PNHR0TgcDo4ePVrbPiIiIv6ib+QLaDipYxTyREQkUPQNJCIiImFBoUZERETCgkKN1BowYAArV64MdBkiIiLtoonCIe6qq65i3LhxXgkjn376KbGxsR0vSkREJAAUasKcYRi43W7s9pb/qJOTk/1QkYiIhBqPx6CkykVxhYviCidF5ebP4goXRdU/z5VWsvdrK99xugN281CFmiYYhkG5s/HVgj0eD+VVbuxVLp9c7RPtsLXqKqw5c+awadMmNm3axKpVqwB4/vnnufvuu/nXv/7FokWL+OKLL9iwYQP9+vVj/vz5fPzxx5SWljJixAiWL1/OtGnTao83YMAA5s2bx7x58wDzSrBnn32Wf/7zn2zYsIE+ffrw1FNPceONN3r9dxYRCWdOt6dBICg6LxDUbC+tdGG1gt1qxW6z4LBZsVst2G1WHDU/a7bbLDiq9zv//ZrtDlvd/vbq1wDFlS6KymvOW1NDdUBpsN38WVLpooV1aatZKaxwERfj0+ZskkJNE8qdbkb+ekNAzr1v2bXERLT8R7Nq1SoOHDhAWloay5YtA2Dv3r0A/PKXv+R3v/sdgwYNIjExkezsbKZPn86jjz5KVFQUL7zwAjNmzOCrr76iX79+TZ5j6dKlPPHEEzz55JP88Y9/5Ac/+AFHjx4lKSnJO7+siEiQMgyDKreHiioP5U435U43ZVUuSivd5pd/Zf0g0DCk1AWEpv6RHGoibFa6RNmJj3bQJcpuPiIdxEfbiY2wkXvsMJH2wE3XVagJYQkJCURERBATE0PPnj0B+PLLLwFYtmwZ11xzTe2+3bp1Y+zYsbWvH330UV5//XXeeustfvrTnzZ5jjlz5nDHHXcA8Pjjj/PHP/6Rbdu2cd111/niVxIRaTfDMDh+ppyjZ0oprzJDSGlFFdtzLRz/4Buq3MZ54cRNhdNdu1+500N5lRk+yqs85ntON25Pq7onWi02wkaXKDMEdIkyg0F8VE1AMH+aYcrA5fbg8hg43R5cbgOXx4OzervTU/3T3cj7HvO1s/rzLrcZzlxuDwbUBpHzw0l8lIP482q4sMaafaIctiZ/N6fTSWbm1yREB2boCRRqmhTtsLFv2bWNvufxeCguKqZLfBefDT911MSJE+u9Li0tZenSpbz99tucOHECl8tFeXk5x44da/Y4Y8aMqX0eGxtLly5dyMvL63B9IiId5fEYfHWqmE+PnGHbN2f49MgZThVVNrKnDY4c7NC5HDYLUQ4b0Q4bcZF2ukTXhICGoST+gmBQ8zou0o7dpouOfUmhpgkWi6XJISCPx4MrwkZMhD1oV9C98CqmX/ziF2zYsIHf/e53DBkyhOjoaG655RaqqqqaPc6Fk70sFgsej8fr9YqItKTK5WF3TiGfHjnDp9+cYfvRsxSWO+vt47BZGNg9lthIO9EOG5F2C+fy8xjUvy+xkQ6iHTaiI2y1P6McNmJqXjtsREU0fB3tsOFQGAkJCjUhLiIiAre75bHazZs3M2fOHG6++WbAvCP5kSNHfFydiEj7lVW5+OzoObZVh5idx89S4az/j6qYCBsT+nflkgFJXDIgiXGpiURH1PV2m0MimUyfnhawK3LEfxRqQtyAAQP45JNPOHLkCHFxcU32ogwZMoT169czY8YMLBYLixcvVo+LiASVs6VVZi/MkTNsO3KWPTmFDea0dI1xcMmAJCYNNEPMqN7xGtKRWgo1Ie6hhx7irrvuYuTIkZSXl/P88883ut/vf/97fvSjHzF16lS6d+/Or371K4qKivxcrYhInRPnyuvNhzlwqqTBPn0So7lkQFcuGZjEpAFJDE6Ow2rVjYelcQo1IW7YsGF89NFH9bbNmTOnwX4DBgzg3//+d71tP/nJT+q9vnA4ymhkUYJz5861q04R6dzKq9zsyy1iT04hu46f45NvzpBzrrzBfkN6xFX3xJhDSn27BmjBEwlJCjUiIuJVZoApZHd2IbtzzCBz6HRJg6Ekm9XCqN7xtfNhLhnQlW5xkQGqWsKBQo2IiLTbhQFmd845DuWV0NjyLt3jIhndJ57RfROZ2L8rF/fvSlykvobEe/S3SUREWqWsysW+E0Xszilkd06h2QPTRIBJ7hLJ6D4JpPVJYHT1IyU+slW3gBFpL4UaERFpoLTSxb7cInZnm+Fld04hX59uPMD0uDDA9E0gJT7K/0VLp6dQIyISpjweg+LKursp196nqIV7Fp0rc3KkoLTRGximxDfsgemhACNBQqFGRCREFFc4+fp0KV/nlZBXXHleWDHv+HzhnZZLqlp7Z+XG9YyPOq/3JZ60Pgn06KIAI8FLoUZEJIgYhsHp4koO5ZXw9ekSDuWVcKj6Z+P3NWpZhN163g0Lz7tZ4QU3NTz/3kWDe8QqwEjIUagREQkAjwFHC8o4erbCDC7nhZfiCleTn+vRJZIhPeLolRBdG0jq31jxvLsqV4eVSHvHb5IrEgoUajq5AQMGMG/ePObNmxfoUkTCUoXTzeHTpfV7XU4V83WeDdfHWxr9jNUC/ZJiGNIjjsE94hiSHMeQHnEMSo4jIVr3LxJpikKNiEgruT0GJZV1c1Zq57A0MrflVJE5hHT8bFkT81osRNqtDKoOLDXBZUiPOPp3iyHKod4VkbZqV6hZvXo1Tz75JLm5uYwaNYqVK1dyxRVXNLrvnDlzeOGFFxpsHzlyJHv37gXMu6guX76cF154gZycHC666CJ++9vfct1117X7vCIiYM5RcboNyqvclDurH1VuyqpcFwSSmuf1J9ueH1ZKKpseFmpOQrSjXnAZ0C2K43s+5c6Z1xMVGeHl31ik82pzqFm7di3z5s1j9erVXHbZZfz5z3/m+uuvZ9++ffTr16/B/qtWreI3v/lN7WuXy8XYsWOZNWtW7baHH36Yv/71rzz77LMMHz6cDRs2cPPNN7N161bGjx/frvN2Bn/+859ZtmwZx48fx2qtu0vtjTfeSNeuXfn1r3/N/Pnz+fjjjyktLWXEiBEsX76cadOmBbBqCUUut4cT5yo4UlDK0TNlHM0v5UhBGWVVLuw2Kw6rBbvNct5zKw6bBbvVit1mIcJm/rRbq7fbrNitFhzV2x3V+zku+FyVy0O5001FdRApd3oor3KdF048lDtd5wUWDxVVbsqcLsqrPObnnO4Gy/N3VKTdWjfZtnoCbvz5c1miHCTFRTC4OsR0i42ot+ic0+kk85B5mwAR8Z42h5oVK1Ywd+5c7rnnHgBWrlzJhg0bePrpp1m+fHmD/RMSEkhISKh9/cYbb3D27Fnuvvvu2m1/+ctfWLRoEdOnTwfg/vvvZ8OGDTz11FP89a9/bdd5O8wwwFnW+Hsej/lelQ2sPrjlvSMGWrHq5qxZs/jZz37Ge++9x3e+8x0Azp49y4YNG/jHP/5BSUkJ06dP59FHHyUqKooXXniBGTNm8NVXX3XaIChNq3R5OFUO//7qNDnnKjlaYAaXowWlZJ8tx+XlYBAINquFGIeNqAgb0Q7beZNr7c2ElLrtNaFFE29FglObQk1VVRU7duxgwYIF9banp6ezdevWVh0jIyODadOm0b9//9ptlZWVREXVv3QwOjqaLVu2dOi8lZWVVFbWXQJZVFQEmP9Kcjqd9fZ1Op0YhoHH48Hj8UBVKdbf9G30uFYgscXftP08C7IhIrbF/RITE7n22mt56aWXuPrqqwGzRyspKYmrr74am83G6NGja/dftmwZr7/+Om+++Wa9O3TX/N5eqd3jMbv7nU5sto7/j7/mz+nCPy9pn7IqF8fOlHPsTJnZ41JgPj92powT5yowsMPnOxv9bITdSr+u0fTvFkP/pBj6JUWTEO3A5TGHd5xuDy6Pgcvtwek2ap+b79e8Zz531rxXvd/5n3V5DKqq34uwW4l22IhyWIlx2ImKqHltI9phJbo6nJivzf2iHbba7Rduc9i88I8Qw4PT2bH/XvT32n/U1v7jy7Zu7THbFGry8/Nxu92kpKTU256SksLJkydb/Hxubi7vvPMOL7/8cr3t1157LStWrODKK69k8ODBvPvuu7z55pu43e4OnXf58uUsXbq0wfaNGzcSE1P/dvZ2u52ePXtSUlJCVVUVOMt8GlyaU1RcDA53q/a9+eabmTdvHsuXLycyMpK//OUv3HzzzZSWllJaWspvf/tbNm7cSG5uLm63m/Lycg4ePFgb8DweDxUVFbWvO6qqqory8nI++OADXK72zT9oTFZWlteO1RkYBhwtgQOFFk5XWMivsJBfAUXO5nsAI60G3aMgOcqgW/XPmtfxEWC1VAGFYAAF5mciqh+tYqt+dJS7+lFRf3Nl9eOcF07hD/p77T9qa//xRVuXlTUxcnKBdk0UvvCGZIZhtOomZWvWrCExMZGZM2fW275q1Sp+/OMfM3z4cCwWC4MHD+buu+/m+eef79B5Fy5cyPz582tfFxUVkZqaSnp6OvHx8fX2raio4Pjx48TFxZm9RkYXs8ekEYZhUFxSQpe4OJ/cnC2+lcNPALfeeisPPvggmzdv5pJLLuGjjz5i5cqVxMfHs3DhQjZu3MgTTzzBkCFDiI6O5tZbb8VisdT+/larlaioqAbt0V4VFRVER0dz5ZVXNuh9aw+n00lWVhbXXHMNDocuZW3JqaIK3vg8l/U7T3A4v7TRfRKjHfTrFl3d22L2uvTvFkOvLg4+27qJ9HS1ta/p77X/qK39x5dt3dp/eLcp1HTv3h2bzdagdyQvL69BL8qFDMPgueeeY/bs2URE1P93XXJyMm+88QYVFRUUFBTQu3dvFixYwMCBAzt03sjISCIjIxtsdzgcDRrc7XZjsViwWq11k25tXRo9rsfjgUoPlsi4ehN0AyE2Npbvfe97/O1vf+Pw4cMMGzaMSy65BIAtW7YwZ84cvv/97wNQUlLCkSNHuOqqq+rVXfN7e4PVasVisTTaxh3h7eOFk0qXm3f35/Hq9uNsOnC69oaD0Q4b3x7Rg+EpXejfPZYB3WLonxRLQkzj7eh0OrFY1Nb+pLb2H7W1//iirVt7vDaFmoiICCZMmEBWVhY333xz7fasrCxuuummZj+7adMmDh06xNy5c5vcJyoqij59+uB0Olm3bh233nprh8/bGfzgBz9gxowZ7N27lx/+8Ie124cMGcL69euZMWMGFouFxYsXe23ujATenpxCXtuRzRuf53CurG68eWL/rsya2Jfpo3vRJUr/ExeRzqPNw0/z589n9uzZTJw4kSlTpvDMM89w7Ngx7rvvPsAc8snJyeHFF1+s97mMjAwmT55MWlpag2N+8skn5OTkMG7cOHJycnjkkUfweDz88pe/bPV5O7Nvf/vbJCUl8dVXX3HnnXfWbv/973/Pj370I6ZOnUr37t351a9+5bW5MxIYZ0qreGNnDq/uyGZ/bt2fZUp8JN+/uC+3TOjLoOS4AFYoIhI4bQ41t912GwUFBSxbtozc3FzS0tLIzMysvZopNzeXY8eO1ftMYWEh69atY9WqVY0es6KigocffpjDhw8TFxfH9OnT+ctf/kJiYmKrz9uZ2Ww2Tpw40WD7gAED+Pe//11v2/lXPQEcOXLEl6WJF7jcHjYdOM2r27N598tTON3m+FKEzco1o1KYNaEvVwxN1ponItLptWui8AMPPMADDzzQ6Htr1qxpsC0hIaHZmcvf+ta32LdvX4fOKxJuDuUV8+r2bNbvzOF0cd3SBKP7JDBrYl9uHNubxBitRisiUkP3fhIJIoXlTv6x6wSv7shm1/Fztdu7xUYwc3wfZk3sy/Ce3rlSTUQk3CjUiASYx2Pw4df5vLo9mw17T1LpMidz26wWrr6oB7Mm9uXqi3oQYQ/slXYiIsFOoUYkAM6VVbEnp4iPDxew/rNsThTWrSI3LCWOWRNSmTm+D8ldGi5JICIijVOoEfGxc2VV7M4pZHdOIXuqfx4/U15vn/goOzeO682sCamM6Zvgk0UdRUTCnULNBQwj9G/aF0idvf3OljYMMNlnyxvdt19SDKP7JHBtWk/SR6YQ5dBNEkVEOkKhplrNzRerqqqIjo4OcDWhq+Yqt86wcmdbAkz/bjGk9UlgdPUjrXdCkyv7iohI+yjUVLPb7cTExHD69GkcDkeztw3weDxUVVVRUVER8NskBAvDMCgrKyMvL4/ExESv3KE7mJypDjB7cgrZnW0GmJxzjQeYARcEmFEKMCIifqFQU81isdCrVy+++eYbjh492uy+hmFQXl5OdHS05j5cIDExkZ49ewa6jA4rq3Lx7y/zeGfPST4/dq71AaZPAgnRCjAiIoGgUHOeiIgIhg4dSlVVVbP7OZ1OPvjgA6688spOMczSWg6HI6R7aCqcbt7/Ko+3v8jl3f15lDvd9d4f2D22OsDEk1bTA6MAIyISNBRqLmC1WomKimp2H5vNhsvlIioqSqEmxFW63Gw+kM/bX5wga98pSqvqgkxqUjQ3jO7NlcO6k9YngXjdHFJEJKgp1Ein43R72HIon7d35bJx30mKK1y17/VOiOKGMb347pjeurRaRCTEKNRIp+Bye/jocAFv78plw76TnCtz1r6XEh/J9NFmkBmfmohVN4YUEQlJCjUSttweg0++KeCfX+Tyrz0nKSitmyvVPS6S6aN78t0xvZnYv6uCjIhIGFCokbDi8RjsOHaWt3edIHPPyXp3t06KjeC6tJ58d3QvJg/qhk1BRkQkrCjUSMgzDIOdx8/x9q5cMnfncrKo7j5KCdEOrhvVkxvG9GLq4G7YbVpXSEQkXCnUSMiqcnl4dvNhXv7kWL11ZLpE2kkf1ZPvjunFZUO66+7WIiKdhEKNhKQvTxbxn3/fxd4TRQDERtiYNjKF744xL8GOtIfuejkiItI+CjUSUlxuD3/+4DAr//cATrdB1xgHi24YyXfH9NINIUVEOjmFGgkZX58u4T//vovPj58DYNqIFJZ/bzTJXSIDW5iIiAQFhRoJeh4Dnt96lKeyDlLp8tAlys4jM0bxvYv7aHE8ERGppVAjQe3YmTL+e6+Nr4u/AuCKod154pYx9EqIDnBlIiISbBRqJCgZhsFLnxzj8cz9lFVZiImw8fANI7ljUqp6Z0REpFEKNRJ0Tpwr51frvmDzwXwAhsQb/HnuFAanJAS4MhERCWYKNRI0DMNg3Wc5LP3HXoorXETarTyUPpTuZ/bSLykm0OWJiEiQU6iRoJBXXMF/rd/N/+7PA2B8v0R+N2ss/RIjyczcG+DqREQkFCjUSMD9Y9cJFr+5h3NlTiJsVuZdM5R7rxiE3WbF6XS2fAAREREUaiSAzpRWsfjNPfzzi1wARvWOZ8Wt47ioZ5cAVyYiIqFIoUYCImvfKRau301+SSU2q4WfXj2En357CA7dcFJERNpJoUb8qrDcydJ/7GX9ZzkADEuJ46lZ4xjdV1c2iYhIxyjUiN9sOnCaX732BSeLKrBa4MdXDuLn04bpnk0iIuIVCjXicyWVLh7P3M/LnxwDYEC3GJ66dSwT+icFuDIREQknCjXiU19kn+MnL3/G8TPlAMyZOoBfXTec6Aj1zoiIiHcp1IjPFJY7uffFHZwsqqBPYjRPzhrD1MHdA12WiIiEKYUa8Zml/9jLyaIKBnaP5a2fXkaXKEegSxIRkTCm62fFJzbuPcn6z3KwWuB3s8Yq0IiIiM8p1IjXnSmt4r9e3w3AvVcOZkL/rgGuSEREOgOFGvEqwzB4+I3d5JdUMSwljp9fMzTQJYmISCehUCNe9Y8vcsncfRK71cJTs8YRaddVTiIi4h8KNeI1eUUV/PrNPQD89NtDtEqwiIj4lUKNeIVhGCxcv5tzZU7S+sTzk6uHBLokERHpZBRqxCte25HNu1/mEWGz8tSscboxpYiI+J2+eaTDTpwrZ9k/9gHw82uGcVHPLgGuSEREOiOFGukQwzD45WtfUFzpYny/RO69clCgSxIRkU5KoUY65K+fHGPLoXyiHFaemjUWm9US6JJERKSTUqiRdjtaUMryzP0A/Oq64QxKjgtwRSIi0pkp1Ei7eDwGv3j1C8qq3Fw6KIm7pgwIdEkiItLJKdRIuzz34TdsO3KG2AgbT94yFquGnUREJMAUaqTNDuWV8MSGrwBYdMNIUpNiAlyRiIiIQo20kcvt4T9f3UWVy8OVw5K5Y1JqoEsSEREBFGqkjf78wWF2HT9HfJSdJ74/BotFw04iIhIcFGqk1fbnFrHyfw8A8MiNo+iZEBXgikREROoo1EirVLk8zP/7Lpxug/SRKdw8vk+gSxIREalHoUZa5Y//Psj+3CK6xjh47ObRGnYSEZGgo1AjLdp1/Byr3/8agMduHk1yl8gAVyQiItKQQo00q8Lp5j9f3YXbYzBjbG+mj+4V6JJEREQapVAjzVqRdYBDeSUkd4lk2Y2jAl2OiIhIk9oValavXs3AgQOJiopiwoQJbN68ucl958yZg8ViafAYNar+F+TKlSu56KKLiI6OJjU1lZ///OdUVFTUvv/II480OEbPnj3bU7600qdHzvDs5sMA/OZ7o+kaGxHgikRERJrW5lCzdu1a5s2bx6JFi9i5cydXXHEF119/PceOHWt0/1WrVpGbm1v7OH78OElJScyaNat2n5deeokFCxawZMkS9u/fT0ZGBmvXrmXhwoX1jjVq1Kh6x9q9e3dby5dWKqty8dCruzAMmDWhL98ZkRLokkREJNgZRkBPb2/rB1asWMHcuXO55557ALOHZcOGDTz99NMsX768wf4JCQkkJCTUvn7jjTc4e/Ysd999d+22jz76iMsuu4w777wTgAEDBnDHHXewbdu2+sXa7eqd8ZPfvPMlRwvK6J0QxeIZIwNdjoiIBKPKEsjZDsc+wXZ0K+nZu+D66wBHQMppU6ipqqpix44dLFiwoN729PR0tm7d2qpjZGRkMG3aNPr371+77fLLL+evf/0r27ZtY9KkSRw+fJjMzEzuuuuuep89ePAgvXv3JjIyksmTJ/P4448zaNCgJs9VWVlJZWVl7euioiIAnE4nTqezVfU2puazHTlGMNv6dQEvfnQUgMdvHkW0LXC/a7i3dTBRW/uP2tp/1NZeVnwSS/Y2LMc/wZL9CZaTu7EYbsAc+okGyk98AX3He/W0rf3za1Ooyc/Px+12k5JSfygiJSWFkydPtvj53Nxc3nnnHV5++eV622+//XZOnz7N5ZdfjmEYuFwu7r///nrhafLkybz44osMGzaMU6dO8eijjzJ16lT27t1Lt27dGj3f8uXLWbp0aYPtGzduJCam4zdhzMrK6vAxgk2FC36zywZYuDzFQ+FXn5D5VaCrCs+2DlZqa/9RW/uP2rodDA9dKk6QVHqQbiUHSCo9SGxVXoPdyhzdKIgbxpnYoZyJG0bRrhz4IterpZSVlbVqvzYPPwENFl4zDKNVi7GtWbOGxMREZs6cWW/7+++/z2OPPcbq1auZPHkyhw4d4sEHH6RXr14sXrwYgOuvv752/9GjRzNlyhQGDx7MCy+8wPz58xs938KFC+u9V1RURGpqKunp6cTHx7f2123A6XSSlZXFNddcg8MRmC42X/mvN/ZytiqH1K7R/PePpxAb2a6/Il4Tzm0dbNTW/qO29h+vtbWrEsvJXViyP4WKIu8VeCELEJ2EEdcDYpMxYlMgrgdExoOvFz11VWA5sbO6J+ZjLNmfYqk4V28XAwukpOHpOwkjdTJG6mQc8X3oCXTz4d/rmpGWlrTpG6t79+7YbLYGvTJ5eXkNem8uZBgGzz33HLNnzyYiov5VNIsXL2b27Nm183RGjx5NaWkp9957L4sWLcJqbTifOTY2ltGjR3Pw4MEmzxkZGUlkZMOF4hwOh1ca3FvHCRb//vIUr+7IwWKBp24dR2JcdKBLqhVubR3M1Nb+E5RtXVkMh9+HbkOgx4hAV+M1bW7rsjNwfBsc+wiOfwI5n4G7suXP+YotEuJSIC65+meP+j9je9Q9j2jlSERpARz/GI5VP3I/B3dV/X0cMdB3IqReCv0uxdL3EoiKx9bMYX3x97q1x2tTqImIiGDChAlkZWVx8803127PysripptuavazmzZt4tChQ8ydO7fBe2VlZQ2Ci81mwzAMjCZmUldWVrJ//36uuOKKtvwK0oRzZVUsWGdeTTb3soFMGpgU4IpExK9K8uCTP8Onz0JFobmt1zgYdyek3QKxjQ/zhwXDgLPfwLFP6kLM6S8b7hfTHfpdCvE+vPed4TYDVUkelJwyf1YWmoGq8Jj5aElEl+qA06Nh+IHqsPYxFDTSKRCXAqmTod8U6DcZeo4BW5AF72a0eWxh/vz5zJ49m4kTJzJlyhSeeeYZjh07xn333QeYQz45OTm8+OKL9T6XkZHB5MmTSUtLa3DMGTNmsGLFCsaPH187/LR48WJuvPFGbDYzDz700EPMmDGDfv36kZeXx6OPPkpRUVGDycTSPkve2ktecSWDk2N56NqLAl2OiPjLmW9g6x/h85fAVb02WHwf8ws193PzsWERDLvWDDhD00PqS65Rbiec/KJ+iCk51XC/bkPNENPvUvNLPmmQ74eAGuMsN8NN6enqoHOqfuipfX7K/DOsKoYzxXDm65aP3f2iut+v32ToOjAwv6OXtDnU3HbbbRQUFLBs2TJyc3NJS0sjMzOz9mqm3NzcBmvWFBYWsm7dOlatWtXoMR9++GEsFgsPP/wwOTk5JCcnM2PGDB577LHafbKzs7njjjvIz88nOTmZSy+9lI8//rjeVVTSPu/szuXNz09grR52inI017EoImEhdxdsWQn73gDDY27rMwEumwfDb4Dys7D7NTPsnPwCvnzbfMR0g9G3wrg7zH/Fh8AXoN1djuXwe5DzqRlicnaA84KJp1YH9B5fF2JSJ0Ns98AUfCFHNHTtbz6aYxjm8GFJHpTmXRB+TkHJaXCVQ++L637HmPDqlbcYTY3vhKGioiISEhIoLCzs8EThzMxMpk+fHnzj4W2UX1JJ+u8/4ExpFT+9ekjQ9dKEU1sHO7W1/wSsrQ0DvtlkhpnD79VtHzLNDDMDLm88pJzaC5+/DF/83fyyrNFjlBluRt8KXYJogc7C7Np5Isaxj+HUHixc8FUXlVA9T6R6qKX3eDM8SLv58u91a7+/A3tpiwSUYRj86rUvOFNaxfCeXfjZd4YGuiQR8QWPG/b/Az5cCSd2mtssNkj7Hlz2IPQc3fznU0bBtY/BtKXw9btmwPkqE/L2wsaHIWuJGYzG3QHDrgdHlM9/JcD8vQq+hlO74WTNYw+U1F3MUhPRjMT+WGqGWPpNMYddGrkIRUKbQk0n9pePj/Lul3lE2K38/rZxRNj1H7hIWHFWwK6/mXNmauZX2KPh4tkw5SfQdUDbjmezm3Nrhl1rDk/tWW8GnJztcHCD+YhKMCcWj7vTHM7y1vBUZQnk7TOHwmrCy6m95nDKhSxWc2is36W4+lzCuwdK+PZNP1APZCegUNNJfXWymEf/uR+A/7p+OCN6tX84TkSCTEUhfJoBHz9dN1wUlQiT7oXJ/+GduSLRXeGSuebj9AEzPH2xFopyYHuG+eg21Oy9GXM7JLTyiiHDgKITcGpP/QBz5jBcOIQEZkhLGQU908wep55joMdIiIwzD+d0UvFNZsd/XwkJCjWdUIXTzc/+tpMql4erL0rmrqkDAl2SiHhDUS58vBq2P29eAQMQ39fslbn4/9R+0Xtd8jCYtgS+/bA5Z+fzv5nDXQUH4d1l8O7/hUFXmb03w79bt46K2wmnv6oOMOcNIZWfafw8cT2rg8t5ASZpEFh1cYOYFGo6od+88yVfnSqme1wkT84a26rVoEUkiOUfgq2rYNcrdYunJY8w58uMvsV/l2BbbTD42+ajogj2vWkOTx3bak5MPvyeuYbKoG/BuWPmWjAXLvYG5nyf7sPqB5iU0ebCcyLNUKjpZP795SnWbD0CwO9mjaF7XMMVl0UkRGTvgA9/D/vfpnZopt8U80qmoemBnQgbFW/O3bl4trkWzq5XYNfLZpj58u26/SLjISWtfoBJHuG/ycYSVhRqOpG84gp+8eoXANx92QCuuqhHgCsSkTYrOwNHtsC2Z+DI5rrtF003e2b6XRq42pqSNBCuXgjf+pXZa5O9HboNNgNMYv+QWOtGQoNCTSfh8Rj84tUvKKi+fPtX1w0PdEki0pLa5fvPuz9P/ld171vt5hoxlz0IPULgv2mr1VwLZ8Dlga5EwpRCTSexZusRNh04TaTdyh/vGK9Vg0WCUe3y/eeFmPMXu6vRfZg5vHTp/ZDQ1/91igQphZpOYN+JIn7zjnlztoe/O5KhKV0CXJGIAOaS9kc/q7sHUVPL9/e5uO4mg6mTw/vmkiIdoFAT5sqr3Dz4yk6q3B6mjUjhh5P7Bbokkc6revl+65GtXPVlFvbPs+vuu1QjKrHuvjy1y/dr0qxIayjUhLnHMvdxMK+EHl0ieeKWMbp8W0KTYZiX/laVQlVJ9c+mnpc1s895r12VZliIiIWIuOqfsQ1fO5rY3thn7BF1NXvc5gq45w8lFWUDYAMSavbrOqD6HkTVDy3fL9JuCjVhLGvfKf76sXnH9KduHUtSbEQLnxDxE48bygrOu3twXt1dhGu2lZ421zpxVocRj8v7dVQVm+fxFqu9LuBUFkNlUf33LTboNQZ3n0nsOO1g/I334UhK9d75RTo5hZowdaqogl++tguAe68cxBVDtWiV+JhhmPcDKj19QVA5P6xUbyvLbzjs0lr2qNb3nDhimt7PHgmuiiZ6c1ro5akqrQtbVaXmccAMXhWF5gPMheZSL6nriekzASLj8Did5GZmMr5LT++0vYgACjVhyeMx+M+/7+JsmZNRveN5KP2iQJckoayyxLwCpzakNBFWSvMaXx22SRaITYa4HtWPlLqfsT3M1WOjEi8YCooxb6oYbNyu+iGnqgRsEZA8XEv4i/hREP7fQTrq/205zJZD+UQ5rKy6fbzuvi0Nuaqqg0pdSLEW5jL6+HZs616t39viLG3bsaMSG4aUuB7VQeW8bTHdgjOgtIfNDrYE8w7VIhIwYfJ/FKmxJ6eQJzeYi3MtmTGKIT18dAM76bizR+DQu23s3WgjV0X9eSo1PSrlZxvsagMGAeQ3chxHTCNBJaW6pyXlvO09zGEdEZEAUKgJI2VVLn72t5043QbXjkrh9ks0ATHoVBbD3jdg19/g6IeBrcXqqDf044npzsHcIoaMnYotoVf9AOOruzuLiHiRQk0Y+b9v7+Nwfik946P4zfd0+XbQ8Hjgm01mkNn/j/MWV7OYy8XHpfju3DZH40M/cT0gumu9e+64nU6+zMxk0CXTsTn8dFdnEREvUqgJE//ak8vfth3HYoEVt42lqy7fDrz8Q+ZdiXetrV2fBIBuQ2DsHTD2di1xLyLiRQo1YSC3sJxfrdsNwH3fGszUwd0DXFEnVn4O9q6Hz/8G2dvqtkclQNr3Yeyd0Hei7kosIuIDCjUhzu0xmL92F4XlTsb0TeDn04YFuqTOx+2Cw+/B5y/Bl5ngrjS3W6wwZJrZK3PRdC11LyLiYwo1Ie7PH3zNR4cLiImw6fJtfzu1zxxe+uLv5pVFNXqMNIPMmFtBi6uJiPiNQk0I23X8HCs2HgDgkRtHMbB7bIAr6gRKC2DPa/D5y5D7ed326CQzxIy9A3qN1fCSiEgAKNSEqNJKFw++shOXx+CG0b2YNUETTn3G7YSDG80gc2ADeJzmdqsdhl1nBpmh6fVvZigiIn6nUBOiHnlrL0cKyuidEMXjN4/W5du+UFkMm35rhpmygrrtvcaaE35H3wKxmpQtIhIsFGpC0NtfnODVHdlYLfD728aREKM1Rbwu9wt47W4oOGS+ju0BY28zw0zKyMDWJiIijVKoCTHZZ8tYuN68fPsnVw9h8qBuAa4ozBgGbM+Af/2XeRVTfB+Y/iQMvTZ87lMkIhKm9H/pEFJz+XZxhYtxqYn87DtDA11SeKkohLd+BvveMF8Puw5mPg0xSQEtS0REWkehJoSsfu8Q246cIS7Szh9uH4/Dpsu3vSbnM3O46ewRcwLwtKUw5Se6iklEJIQo1ISIz46dZeW7BwFYdtMo+nWLCXBFYcIw4JP/gY2LzauaEvrBrOfNVX9FRCSkKNSEgOIKJw++shO3x+Cmcb25eXyfQJcUHsrOwJs/ha/+ab4e/l246b/NGz2KiEjIUagJAUve3MvxM+X07RrN/52Zpsu3veH4p+ZwU+FxsEVA+mMw6ccabhIRCWEKNUHuSH4p63fmYLXAytvGER+ly7c7xOOBj/4b3l0KHhd0HWgON/UeH+jKRESkgxRqgtzh/BIAhveMZ+IAXYXTIaUF8Mb9cHCD+XrU92DGKoiKD2xdIiLiFQo1QS77bDkAfbtGB7iSEHd0K7w2F4pPgC0Srv8tTJij4SYRkTCiUBPk6kKNrnZqF48HtqyA9x4Hww3dhsKsNdAzLdCViYiIlynUBLnss2WAemrapSQP1t8Lh98zX4+5HW54CiLjAluXiIj4hEJNkNPwUzsd3gTrfwwlp8AeDTf8Dsb9QMNNIiJhTKEmyGn4qY08btj0hHl3bQxIHmEON/UYHujKRETExxRqglhppYszpVUA9E1ST02LinLN3pkjm83X42fD9U9AhAKhiEhnoFATxHLOmb00CdEOrU/TkkPvmvNnyvLBEQszVsKYWwNdlYiI+JFCTRDTJOFWcLvgvcfMK5wAUkabw03dhwS0LBER8T+FmiCmScLNyPsS9r8Fu1+D/K/MbRPnwrWPgyMqsLWJiEhAKNQEMU0SPo9hQO4XZpDZ9ybkH6h7LzLeXBk47XuBq09ERAJOoSaIdfrhJ8PAkvMZI3PWYl/9azh3pO49qwMGXw0jb4KLpkOMbiEhItLZKdQEsU7ZU+PxwPFPqntk3sJelM3QmvfsUTBkmhlkhl0LUQmBrFRERIKMQk0Q6zRzatwuOPqhGWT2vw0lJ2vfMhyxnIgdRcq3/wP7RddpNWAREWmSQk2QOn+Nmj7hGGpcVXDkA3N+zJf/hLKCuvciE+Ci62DkTbj6XcH2rPeYPmI6OHRZu4iINE2hJkiF5Ro1zgrzPkz73oSvMqGisO696CQYfoM5tDTwW2CPqP6MMzC1iohIyFGoCVJhM0nY7TQDzL434cAGqCqpey+2B4yYASNvhP6Xg01/HUVEpP30LRKkwmI+jccNr9wJBzfWbYvvAyNuNINM6mSw2gJXn4iIhBWFmiAVFlc+ffCkGWjs0TDpHhg5E3pfDFZroCsTEZEwpFATpEJ++OnQ/8L7vzGfz1gJY28PaDkiIhL+9E/mIBXSPTWF2bDux4ABE+Yo0IiIiF+0K9SsXr2agQMHEhUVxYQJE9i8eXOT+86ZMweLxdLgMWrUqHr7rVy5kosuuojo6GhSU1P5+c9/TkVFRbvPG+pCdk6Nqwr+fheUn4FeY+G63wa6IhER6STaHGrWrl3LvHnzWLRoETt37uSKK67g+uuv59ixY43uv2rVKnJzc2sfx48fJykpiVmzZtXu89JLL7FgwQKWLFnC/v37ycjIYO3atSxcuLDd5w1lIb1GTdZiyNlurvZ764u6uaSIiPhNm0PNihUrmDt3Lvfccw8jRoxg5cqVpKam8vTTTze6f0JCAj179qx9bN++nbNnz3L33XfX7vPRRx9x2WWXceeddzJgwADS09O544472L59e7vPG8pqemlCbo2aPevgk/8xn9/8Z+g6IKDliIhI59KmicJVVVXs2LGDBQsW1Nuenp7O1q1bW3WMjIwMpk2bRv/+/Wu3XX755fz1r39l27ZtTJo0icOHD5OZmcldd93VofNWVlZSWVlZ+7qoqAgAp9OJswOLutV8tiPHaM6R/GIA+iRG+ewcXpd/EPtb/x8WwD31QTyDpnll4Txft7XUUVv7j9raf9TW/uPLtm7tMdsUavLz83G73aSkpNTbnpKSwsmTJ5v4VJ3c3FzeeecdXn755Xrbb7/9dk6fPs3ll1+OYRi4XC7uv//+2hDT3vMuX76cpUuXNti+ceNGYmI6PgE3Kyurw8dozAe5FsCGvbKQzMxMn5zDm2zuSq488AjxVaWcjhvBR2XjMLxct6/aWhpSW/uP2tp/1Nb+44u2Lisra9V+7bqk22Kx1HttGEaDbY1Zs2YNiYmJzJw5s972999/n8cee4zVq1czefJkDh06xIMPPkivXr1YvHhxu8+7cOFC5s+fX/u6qKiI1NRU0tPTiY+Pb7HepjidTrKysrjmmmtw+OB+RF/86ys4cpQJwwcy/fqLvH58rzIMbG/dj7UiByMuhcS5r3F9XErLn2slX7e11FFb+4/a2n/U1v7jy7auGWlpSZtCTffu3bHZbA16R/Ly8hr0olzIMAyee+45Zs+eTURERL33Fi9ezOzZs7nnnnsAGD16NKWlpdx7770sWrSo3eeNjIwkMjKywXaHw+GVBvfWcS50otAcMuvXLTb4/yP8NAP2vAYWG5ZbnsfRta9PTuOrtpaG1Nb+o7b2H7W1//iirVt7vDZNFI6IiGDChAkNupaysrKYOnVqs5/dtGkThw4dYu7cuQ3eKysrw3rBKrM2mw3DMDAMo0PnDUUhs0ZNzmfwr+p5TtOWwIDLAluPiIh0am0efpo/fz6zZ89m4sSJTJkyhWeeeYZjx45x3333AeaQT05ODi+++GK9z2VkZDB58mTS0tIaHHPGjBmsWLGC8ePH1w4/LV68mBtvvBGbzdaq84aTkFhNuOyMuR6NuwqGfxem/izQFYmISCfX5lBz2223UVBQwLJly8jNzSUtLY3MzMzaq5lyc3MbrB1TWFjIunXrWLVqVaPHfPjhh7FYLDz88MPk5OSQnJzMjBkzeOyxx1p93nBRUunibJk5yzto16jxeOD1/4DCY9B1INz0J2jFnCoRERFfatdE4QceeIAHHnig0ffWrFnTYFtCQkKzM5ftdjtLlixhyZIl7T5vuMgJhTVqtqyovlFllLnAXnRioCsSERHRvZ+CTdAPPR1+H96r7kGb/jvoNSag5YiIiNRQqAkyQX3Pp6ITsO4eMDww7odw8exAVyQiIlJLoSbI1PXUBNmVT24nvHo3lJ6GlDS44XeBrkhERKQehZogE7Q9Nf/7CBz/GCLjq29UGWT1iYhIp6dQE2SCco2afW/BR/9tPp+5GroNDmw9IiIijVCoCTJBN1G44Gt48yfm8yk/hREzAluPiIhIExRqgkjQrVFTVQZ//z9QWQT9psC0RwJdkYiISJMUaoJIUK1RYxiQ+RCc2gOxyXDL82AL0nVzREREUKgJKkE19LTzL/D5S2Cxwi3PQXyvQFckIiLSLIWaIBI0Vz7l7oJ/PmQ+v3oRDLwysPWIiIi0gkJNEAmKNWrKz5nzaNyVMPRauHx+4GoRERFpA4WaIBLwnhrDgDcegLNHILEf3Pw/YNVfERERCQ36xgoiAV+j5sNV8NU/wRYBs16AmKTA1CEiItIOCjVBJKAThY9sgXeXmc+v+w30udj/NYiIiHSAQk2QCOgaNcUn4bUfgeGGMbfBxB/59/wiIiJeoFATJAK2Ro3bBa/NhZJTkDwCvvt7sFj8d34REREvUagJEgEbetr0Gzi6BSLi4La/QESsf88vIiLiJQo1QaJmknCqPycJH/kQNj9lPp+xCroP9d+5RUREvEyhJkj4vaem/CysvxcMD4y9E0bf4p/zioiI+IhCTZDw6xo1hgFv/xyKsqHrQJj+hO/PKSIi4mMKNUHCr2vUfP4S7H0drHb4fgZEdvH9OUVERHxMoSZI1A4/Jfm4p6bga8j8pfn86v+CvhN8ez4RERE/UagJAvXWqEn0YahxVcG6ueAshf6Xw2XzfHcuERERP1OoCQI1a9Qkxjjo4ss1at5/HE7shKhE+N6fwWrz3blERET8TKEmCPjlyqdvPoAtK83nN/4BEvr67lwiIiIBoFATBGonCSf6aJJw2RlY/x+AARf/Hxh5k2/OIyIiEkAKNUHApz01hgH/+BkUn4BuQ8ybVYqIiIQhhZog4NM1aj57Afb/A6wO+P7/020QREQkbCnUBAGfrVFz+gD8a6H5/DuLofd47x5fREQkiCjUBAGfrFHjqqy+fLsMBn4Lpvx/3ju2iIhIEFKoCTCfrVHz7/8LJ7+A6CS4+X/Aqj9qEREJb/qmCzCfrFHz9b9h6x/N5zf9N8T39s5xRUREgphCTYB5/cqn0nx4/X7z+cQfwfAbvHNcERGRIKdQE2BeXaPGMODNn0LJSeh+EaQ/1vFjioiIhAiFmgDzak/N9gw48A7YIqov3/bDHb9FRESChEJNgHltjZq8/bBhkfl82iPQa0zHjiciIhJiFGoCzCtr1DgrYN094KqAwd+Byfd7qToREZHQoVATYF5Zo+bdpXBqD8R0h5lP6/JtERHplPTtF0BeWaPm4P/Cx6vN5zNXQ5cUL1UnIiISWhRqAqiml6bda9SU5MEb95nPJ90Lw671YnUiIiKhRaEmgLLPdGCSsGHAmz+B0tPQYyRcs8zL1YmIiIQWhZoAqp1P0541arY9Awc3gi0Svp8BDh/c4VtERCSEKNQEULsv5z61FzYuNp+nPwopI71cmYiISOhRqAmgdoUaZzm8NhfclTD0Wpj0Yx9VJyIiEloUagIo+1zNasJtGH7auBhO74fYHnDTn8Bi8VF1IiIioUWhJoBqe2pau0bNV/+CT581n9/8NMQl+6gyERGR0KNQEyDFFU7OtWWNmuKT8OYD5vNLfwJDpvmwOhERkdCjUBMgOefMXppWrVHj8cAb90NZAaSMhmlL/FChiIhIaFGoCZA2rVHz8Wr4+t9gjzbvvm2P9HF1IiIioUehJkBavUZNSZ55byeAax+DHsN9XJmIiEhoUqgJkFZfzn38E3BXQfIImPgjP1QmIiISmhRqAqTVoSb3C/Nnnwm6fFtERKQZCjUB0uo1ak5Wh5peY3xckYiISGhTqAmQVq9RU9NT01OhRkREpDkKNQHQ6jVqSvOh+ARggZ5p/ilOREQkRCnUBECr16jJ3WX+TBoEkV38UJmIiEjoaleoWb16NQMHDiQqKooJEyawefPmJvedM2cOFoulwWPUqFG1+1x11VWN7nPDDTfU7vPII480eL9nz57tKT/gWr1GjebTiIiItFqbQ83atWuZN28eixYtYufOnVxxxRVcf/31HDt2rNH9V61aRW5ubu3j+PHjJCUlMWvWrNp91q9fX2+fPXv2YLPZ6u0DMGrUqHr77d69u63lB4VWr1FT01Oj+TQiIiItsrf1AytWrGDu3Lncc889AKxcuZINGzbw9NNPs3z58gb7JyQkkJCQUPv6jTfe4OzZs9x9992125KSkup95pVXXiEmJqZBqLHb7SHbO3O+Nl/O3WusjysSEREJfW0KNVVVVezYsYMFCxbU256ens7WrVtbdYyMjAymTZtG//79m93n9ttvJzY2tt72gwcP0rt3byIjI5k8eTKPP/44gwYNavI4lZWVVFZW1r4uKioCwOl04nQ6W1VvY2o+295jHDtTCkCvhMimj1FZjOPM1+Z5uo+EDtQbyjra1tJ6amv/UVv7j9raf3zZ1q09ZptCTX5+Pm63m5SUlHrbU1JSOHnyZIufz83N5Z133uHll19ucp9t27axZ88eMjIy6m2fPHkyL774IsOGDePUqVM8+uijTJ06lb1799KtW7dGj7V8+XKWLl3aYPvGjRuJiWlh6KcVsrKy2vW5fUdtgIWTh/aSeWZPo/sklXzFFUC5oysbN21rf5Fhor1tLW2ntvYftbX/qK39xxdtXVZW1qr92jz8BGC5YGVbwzAabGvMmjVrSExMZObMmU3uk5GRQVpaGpMmTaq3/frrr699Pnr0aKZMmcLgwYN54YUXmD9/fqPHWrhwYb33ioqKSE1NJT09nfj4+BbrbYrT6SQrK4trrrkGh6OFO2w3Ysnn7wFOZl5zOcNSGr+qyfppDhyEyP6XMH369HbXGuo62tbSempr/1Fb+4/a2n982dY1Iy0taVOo6d69OzabrUGvTF5eXoPemwsZhsFzzz3H7NmziYiIaHSfsrIyXnnlFZYtW9ZiLbGxsYwePZqDBw82uU9kZCSRkQ3vaO1wOLzS4O05TnGFk3PlZjda/+R4HI4m/gjy9gJg7T0Oq/5D9NqfmbRMbe0/amv/UVv7jy/aurXHa9PVTxEREUyYMKFB11JWVhZTp05t9rObNm3i0KFDzJ07t8l9/v73v1NZWckPf/jDFmuprKxk//799OrVq3XFB4maNWq6xjiIi2wmU56svvJJl3OLiIi0SpuHn+bPn8/s2bOZOHEiU6ZM4ZlnnuHYsWPcd999gDnkk5OTw4svvljvcxkZGUyePJm0tKZXxs3IyGDmzJmNzpF56KGHmDFjBv369SMvL49HH32UoqIi7rrrrrb+CgFVt0ZNM3N6XJWQt998rsu5RUREWqXNoea2226joKCAZcuWkZubS1paGpmZmbVXM+Xm5jZYs6awsJB169axatWqJo974MABtmzZwsaNGxt9Pzs7mzvuuIP8/HySk5O59NJL+fjjj5u9iioY1a5R09zl3Hn7weOCqERI7OefwkREREJcuyYKP/DAAzzwwAONvrdmzZoG2xISElqcuTxs2DAMw2jy/VdeeaVNNQarVq1Rc/5Kwq2YgC0iIiK695Pf1YWaZoafdGduERGRNlOo8bPsc60YfjqplYRFRETaSqHGz1rsqfG44WT1gnzqqREREWk1hRo/Kq5wcq7MXKOmT1M9NWcOg7MU7NHQfagfqxMREQltCjV+1Ko1amruzJ0yCqw2P1UmIiIS+hRq/KhVa9TUhBrNpxEREWkThRo/atUaNedfzi0iIiKtplDjRy2uUWMYupxbRESknRRq/KjFK5+KcqD8DFhs0GOkHysTEREJfQo1ftTiGjU1vTTJw8ER5aeqREREwoNCjR+12FOj+TQiIiLtplDjJ61ao6bmyifNpxEREWkzhRo/ad0aNbo9goiISHsp1PhJi2vUlJ2Bomzzec/RfqpKREQkfCjU+EmLa9TUDD11HQhR8X6qSkREJHwo1PhJi2vUaJKwiIhIhyjU+EmLVz5p0T0REZEOUajxk5bXqNE9n0RERDpCocZPmu2pqSyBgkPmc4UaERGRdlGo8YMW16g5tRcwIK4nxPXwb3EiIiJhQqHGD2p6aZpco0aThEVERDpMocYPWp4krJWERUREOkqhxg9aXKNGPTUiIiIdplDjB82uUeOqgrz95nP11IiIiLSbQo0f1PXUNDL8dPpLcFdBZAJ0HeDfwkRERMKIQo0fNNtTc/7Qk8Xix6pERETCi0KNHzQ7UVgrCYuIiHiFQo2PFVU4KSxvZo0aTRIWERHxCoUaH8tpbo0ajwdO7jafq6dGRESkQxRqfKzZoaez30BVCdijoPswP1cmIiISXhRqfKzZNWpqFt3rMRJsjaw0LCIiIq2mUONjzV75VHtnbg09iYiIdJRCjY81u0ZN7SRh3ZlbRESkoxRqfKzJnhrDOO9yboUaERGRjlKo8bEmJwoX50JZPlhskDIyAJWJiIiEF4UaH2p2jZqaXpruw8DRxI0uRUREpNUUanyo2TVqtOieiIiIVynU+FDzt0eovvJJi+6JiIh4hUKND9Vc+ZSa1Njl3OqpERER8SaFGh9qsqem7AwUHjOfq6dGRETEKxRqfKjJ1YRr7veU2B+iE/1blIiISJhSqPGhJteo0SRhERERr1Oo8aEmh5+06J6IiIjXKdT4SL01ahLVUyMiIuJrCjU+UrNGTVJsBLHnr1FTVQb5B8znmiQsIiLiNQo1PtLkfJpTe8HwQGwydOkZgMpERETCk0KNjzR95VP1onu9xoLF4ueqREREwpdCjY+0PElYQ08iIiLepFDjI0331GiSsIiIiC8o1PhIo3Nq3E44tc98rp4aERERr1Ko8ZFGh5/yD4C7EiK6QNeBAapMREQkPCnU+ECTa9TUzqcZDVY1vYiIiDfpm9UHmlyjJrfmyicNPYmIiHibQo0PtHzPJ90eQURExNsUanyg0SufPJ66u3NrkrCIiIjXtSvUrF69moEDBxIVFcWECRPYvHlzk/vOmTMHi8XS4DFq1Kjafa666qpG97nhhhvafd5AanSS8LkjUFkEtkhIvigwhYmIiISxNoeatWvXMm/ePBYtWsTOnTu54ooruP766zl27Fij+69atYrc3Nzax/Hjx0lKSmLWrFm1+6xfv77ePnv27MFms9Xbp63nDaRGe2pqJgn3GAE2RwCqEhERCW9tDjUrVqxg7ty53HPPPYwYMYKVK1eSmprK008/3ej+CQkJ9OzZs/axfft2zp49y9133127T1JSUr19srKyiImJqRdq2nreQGp0To0W3RMREfEpe8u71KmqqmLHjh0sWLCg3vb09HS2bt3aqmNkZGQwbdo0+vfv3+w+t99+O7GxsR06b2VlJZWVlbWvi4qKAHA6nTidzlbV25iazzZ1jJqemp5xEbX72E7swgq4k9PwdODcnU1LbS3eo7b2H7W1/6it/ceXbd3aY7Yp1OTn5+N2u0lJSam3PSUlhZMnT7b4+dzcXN555x1efvnlJvfZtm0be/bsISMjo8PnXb58OUuXLm2wfePGjcTExDTyibbJyspqsK3cBYXlZrPu2fYBB23m9muPfkoU8OE3xZzNy+zwuTubxtpafENt7T9qa/9RW/uPL9q6rKysVfu1KdTUsFxwd2nDMBpsa8yaNWtITExk5syZTe6TkZFBWloakyZN6vB5Fy5cyPz582tfFxUVkZqaSnp6OvHx8S3W2xSn00lWVhbXXHMNDkf9+TFfniyGTz+ia4yDm2ekmxuLT+LYWYhhsTLlpnsgIrbd5+5smmtr8S61tf+orf1Hbe0/vmzrmpGWlrQp1HTv3h2bzdagdyQvL69BL8qFDMPgueeeY/bs2URERDS6T1lZGa+88grLli3zynkjIyOJjIxssN3hcHilwRs7zslis4ssNSmm7r38/QBYug3FEZvY4fN2Rt76M5OWqa39R23tP2pr//FFW7f2eG2aKBwREcGECRMadC1lZWUxderUZj+7adMmDh06xNy5c5vc5+9//zuVlZX88Ic/9Np5/a3RK59OaiVhERERX2vz8NP8+fOZPXs2EydOZMqUKTzzzDMcO3aM++67DzCHfHJycnjxxRfrfS4jI4PJkyeTlpbW5LEzMjKYOXMm3bp1a/N5g0Wja9TU3vNJoUZERMRX2hxqbrvtNgoKCli2bBm5ubmkpaWRmZlZezVTbm5ug7VjCgsLWbduHatWrWryuAcOHGDLli1s3LixXecNFo331OhybhEREV9r10ThBx54gAceeKDR99asWdNgW0JCQoszl4cNG4ZhGO0+b7BosEZN+Tk4e8R8rp4aERERn9G9n7yswfBTzf2eElIhJilAVYmIiIQ/hRovKqpwUlhuXv3UJ7G6p0Z35hYREfELhRovyj5j9tIkxUYQG1k9sqdJwiIiIn6hUONFmiQsIiISOAo1XtRgkrCzHE5/ZT5XT42IiIhPKdR4UYNJwnn7wHBDTDeI7x3AykRERMKfQo0XNRh+On8+TSvujSUiIiLtp1DjRQ2Gn3Jrbo+gK59ERER8TaHGi+p6amrWqNEkYREREX9RqPGSwnInRRUuoHqNGrcLTu013+ypnhoRERFfU6jxkpyzF6xRU3AQXBUQEQdJgwJcnYiISPhTqPGSJicJp6SBVc0sIiLia/q29ZIGk4Q1n0ZERMSvFGq8pMEaNTVXPmnRPREREb9QqPGSesNPhqEbWYqIiPiZQo2X1PTUpHaNgXNHoaIQrA5IHh7gykRERDoHhRovqddTUzNJuMcIsEcEsCoREZHOQ6HGC+qtUdM1WpOERUREAkChxgtq1qjpFhtBTIT9vHs+aT6NiIiIvyjUeEGDNWrUUyMiIuJ3CjVeUO9y7pI8KM4FLObCeyIiIuIXCjVeUG/hvZqhp25DIDIugFWJiIh0Lgo1XlBv+Olk9aJ7GnoSERHxK4UaL6g3/FQ7SVihRkRExJ8Uarygfk+NJgmLiIgEgj3QBYQ6wzBY/YMJZJ8tIzXWBWcOm2/ocm4RERG/UqjpIIvFwuVDu5svjm41f8b3gdhugStKRESkE9LwkzfpztwiIiIBo1DjTbm6M7eIiEigKNR4kyYJi4iIBIxCjbe4KuH0l+ZzDT+JiIj4nUKNt+TtA48LortCQt9AVyMiItLpKNR4y/mL7lksga1FRESkE1Ko8RbNpxEREQkohRpvqb2cW1c+iYiIBIJCjTd43HBqr/lcl3OLiIgEhEKNNxQcAmcZOGKg2+BAVyMiItIpKdR4Q80k4ZQ0sNoCW4uIiEgnpVDjDSer59NokrCIiEjAKNR4w/mXc4uIiEhAKNR0lGHocm4REZEgYA90ASHP44KrF5nBpsfIQFcjIiLSaSnUdJTNAZN+HOgqREREOj0NP4mIiEhYUKgRERGRsKBQIyIiImFBoUZERETCgkKNiIiIhAWFGhEREQkLCjUiIiISFhRqREREJCwo1IiIiEhYUKgRERGRsKBQIyIiImFBoUZERETCgkKNiIiIhIVOdZduwzAAKCoq6tBxnE4nZWVlFBUV4XA4vFGaNEFt7T9qa/9RW/uP2tp/fNnWNd/bNd/jTelUoaa4uBiA1NTUAFciIiIibVVcXExCQkKT71uMlmJPGPF4PJw4cYIuXbpgsVjafZyioiJSU1M5fvw48fHxXqxQLqS29h+1tf+orf1Hbe0/vmxrwzAoLi6md+/eWK1Nz5zpVD01VquVvn37eu148fHx+o/ET9TW/qO29h+1tf+orf3HV23dXA9NDU0UFhERkbCgUCMiIiJhQaGmHSIjI1myZAmRkZGBLiXsqa39R23tP2pr/1Fb+08wtHWnmigsIiIi4Us9NSIiIhIWFGpEREQkLCjUiIiISFhQqBEREZGwoFDTiNWrVzNw4ECioqKYMGECmzdvbnb/TZs2MWHCBKKiohg0aBD/8z//46dKQ19b2nr9+vVcc801JCcnEx8fz5QpU9iwYYMfqw19bf27XePDDz/Ebrczbtw43xYYRtra1pWVlSxatIj+/fsTGRnJ4MGDee655/xUbWhra1u/9NJLjB07lpiYGHr16sXdd99NQUGBn6oNXR988AEzZsygd+/eWCwW3njjjRY/4/fvR0PqeeWVVwyHw2E8++yzxr59+4wHH3zQiI2NNY4ePdro/ocPHzZiYmKMBx980Ni3b5/x7LPPGg6Hw3jttdf8XHnoaWtbP/jgg8Zvf/tbY9u2bcaBAweMhQsXGg6Hw/jss8/8XHloamt71zh37pwxaNAgIz093Rg7dqx/ig1x7WnrG2+80Zg8ebKRlZVlfPPNN8Ynn3xifPjhh36sOjS1ta03b95sWK1WY9WqVcbhw4eNzZs3G6NGjTJmzpzp58pDT2ZmprFo0SJj3bp1BmC8/vrrze4fiO9HhZoLTJo0ybjvvvvqbRs+fLixYMGCRvf/5S9/aQwfPrzetv/4j/8wLr30Up/VGC7a2taNGTlypLF06VJvlxaW2tvet912m/Hwww8bS5YsUahppba29TvvvGMkJCQYBQUF/igvrLS1rZ988klj0KBB9bb94Q9/MPr27euzGsNRa0JNIL4fNfx0nqqqKnbs2EF6enq97enp6WzdurXRz3z00UcN9r/22mvZvn07TqfTZ7WGuva09YU8Hg/FxcUkJSX5osSw0t72fv755/n6669ZsmSJr0sMG+1p67feeouJEyfyxBNP0KdPH4YNG8ZDDz1EeXm5P0oOWe1p66lTp5KdnU1mZiaGYXDq1Clee+01brjhBn+U3KkE4vuxU93QsiX5+fm43W5SUlLqbU9JSeHkyZONfubkyZON7u9yucjPz6dXr14+qzeUtaetL/TUU09RWlrKrbfe6osSw0p72vvgwYMsWLCAzZs3Y7frfxWt1Z62Pnz4MFu2bCEqKorXX3+d/Px8HnjgAc6cOaN5Nc1oT1tPnTqVl156idtuu42KigpcLhc33ngjf/zjH/1RcqcSiO9H9dQ0wmKx1HttGEaDbS3t39h2aaitbV3jb3/7G4888ghr166lR48eviov7LS2vd1uN3feeSdLly5l2LBh/iovrLTl77bH48FisfDSSy8xadIkpk+fzooVK1izZo16a1qhLW29b98+fvazn/HrX/+aHTt28K9//YtvvvmG++67zx+ldjr+/n7UP7/O0717d2w2W4OEn5eX1yBt1ujZs2ej+9vtdrp16+azWkNde9q6xtq1a5k7dy6vvvoq06ZN82WZYaOt7V1cXMz27dvZuXMnP/3pTwHzi9cwDOx2Oxs3buTb3/62X2oPNe35u92rVy/69OlDQkJC7bYRI0ZgGAbZ2dkMHTrUpzWHqva09fLly7nsssv4xS9+AcCYMWOIjY3liiuu4NFHH1XvuhcF4vtRPTXniYiIYMKECWRlZdXbnpWVxdSpUxv9zJQpUxrsv3HjRiZOnIjD4fBZraGuPW0NZg/NnDlzePnllzUG3gZtbe/4+Hh2797N559/Xvu47777uOiii/j888+ZPHmyv0oPOe35u33ZZZdx4sQJSkpKarcdOHAAq9VK3759fVpvKGtPW5eVlWG11v/qs9lsQF0vgnhHQL4ffTYFOUTVXB6YkZFh7Nu3z5g3b54RGxtrHDlyxDAMw1iwYIExe/bs2v1rLln7+c9/buzbt8/IyMjQJd2t1Na2fvnllw273W786U9/MnJzc2sf586dC9SvEFLa2t4X0tVPrdfWti4uLjb69u1r3HLLLcbevXuNTZs2GUOHDjXuueeeQP0KIaOtbf38888bdrvdWL16tfH1118bW7ZsMSZOnGhMmjQpUL9CyCguLjZ27txp7Ny50wCMFStWGDt37qy9fD4Yvh8Vahrxpz/9yejfv78RERFhXHzxxcamTZtq37vrrruMb33rW/X2f//9943x48cbERERxoABA4ynn37azxWHrra09be+9S0DaPC46667/F94iGrr3+3zKdS0TVvbev/+/ca0adOM6Ohoo2/fvsb8+fONsrIyP1cdmtra1n/4wx+MkSNHGtHR0UavXr2MH/zgB0Z2drafqw497733XrP/Dw6G70eLYai/TUREREKf5tSIiIhIWFCoERERkbCgUCMiIiJhQaFGREREwoJCjYiIiIQFhRoREREJCwo1IiIiEhYUakRERCQsKNSIiIhIWFCoERERkbCgUCMiIiJhQaFGREREwsL/D2JTPY8MAClOAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(np.linspace(0.01,1,20),train_score_ls,label = 'train') # 训练\n",
    "plt.plot(np.linspace(0.01,1,20),val_score_ls,label = 'val') # 验证\n",
    "plt.legend()\n",
    "plt.grid()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "id": "37ce9bd1",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7850560398505604"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 参数确定，计算acc\n",
    "model = LogisticRegression(random_state=0\n",
    "                               ,penalty='l1',solver=\"liblinear\",C=1,max_iter=1000\n",
    "                              )\n",
    "\n",
    "model.fit(train_X,train_y) \n",
    "score_r = model.score(val_X,val_y)\n",
    "score_r"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "id": "a22ea0db",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>P</th>\n",
       "      <th>r</th>\n",
       "      <th>f1</th>\n",
       "      <th>S</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.743504</td>\n",
       "      <td>0.861709</td>\n",
       "      <td>0.798255</td>\n",
       "      <td>5944</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.840574</td>\n",
       "      <td>0.710375</td>\n",
       "      <td>0.770010</td>\n",
       "      <td>6101</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          P         r        f1     S\n",
       "0  0.743504  0.861709  0.798255  5944\n",
       "1  0.840574  0.710375  0.770010  6101"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p, r, f1, s = precision_recall_fscore_support(val_y.reshape(-1, 1), model.predict(val_X))\n",
    "pd.DataFrame({'P':p, 'r':r, 'f1':f1, 'S':s})"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8f0e8c34",
   "metadata": {},
   "source": [
    "### 4.3xgboost"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "id": "cbee9e24",
   "metadata": {},
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "id": "c565535a",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|██████████████████████████████████████████████████████████████████████████████████| 25/25 [02:36<00:00,  6.26s/it]\n"
     ]
    }
   ],
   "source": [
    "# 调节参数\n",
    "train_score_ls = []\n",
    "val_score_ls = []\n",
    "\n",
    "for n_estimators in tqdm(range(10,500,20)):\n",
    "    model = XGBClassifier(\n",
    "    n_estimators=n_estimators,    # 树的数量\n",
    "    learning_rate=0.1,   # 学习率\n",
    "    max_depth=6,         # 树的最大深度\n",
    "    use_label_encoder=False, # 避免警告（对sklearn兼容性）\n",
    "    eval_metric=\"logloss\"    # 损失函数\n",
    "    )\n",
    "    \n",
    "    model = model.fit(train_X,train_y)\n",
    "    train_score_ls.append(model.score(train_X,train_y))\n",
    "    val_score_ls.append(model.score(val_X,val_y))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "id": "3a2d7a62",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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mMblMnj+oy3sSskgNNDO7IEd8PPREggiIlIyCjVimre+2cNX21KwWS383yPtiQzxM7tLIiJSjinUiCmWb0/h9ZW7AZh4T0s6RFczuUciIlLeKdRIqUtIyWDU4s0ADIqNZkDHOuZ2SEREKgSFGilVJzNzGTL/RzJznXStX52xfbQEgoiIXBsKNVJqDMNg1H82c/DEWaKq+THj4fbYrPoVFBGRa0N/UaTUfPzzYb5NOIaPtxezB3agaoCP2V0SEZEKRKFGSsXR9GwmfO6eMXjk7Y1oFhFsco9ERKSiUaiR684wDMZ+so307Dxa167CH7vXN7tLIiJSASnUyHX32ZYjrNx5FJvVwtT+rfHWdTQiInId6K+LXFfHMnIYd26hyqduaUTTcA07iYjI9aFQI9fVuM+2czLLQbOIYIbfooUqRUTk+lGokevmq63JfLk1GauXhVf6t9bt2yIicl3pr4xcFycyc3np020A/OmmBrSsVcXkHomISEVXolAzY8YM6tWrh6+vLzExMaxZs+ay7RcsWECbNm3w9/cnIiKCxx9/nOPHj3tenzt3LhaLpcAjOzv7qo4r5pnw+XbSzuTSqGYgI25raHZ3RESkEih2qFm8eDEjR45k7NixbNq0ie7du9O7d2+SkpIKbb927VoeffRRBg8ezPbt2/noo4/48ccfGTJkSL52wcHBJCcn53v4+vqW+LhinpU7jvLfzUfwssAr97fB7m01u0siIlIJFDvUTJs2jcGDBzNkyBCaNWvG9OnTiYqKYubMmYW2X79+PdHR0Tz99NPUq1ePG264gaFDh/LTTz/la2exWAgPD8/3uJrjijlOn3Xw4idbAXiie33aRoWY2yEREak0vIvTODc3l/j4eF544YV823v27Mm6desK3Sc2NpaxY8eybNkyevfuTWpqKkuWLKFPnz752p05c4a6devidDpp27Ytf//732nXrl2JjwuQk5NDTk6O53l6ejoADocDh8NRpM98vl1R21d2Ez7fRmpGDvWq+/PUzfVKXDfV3RyquzlUd3Oo7qWvpDUvavtihZq0tDScTidhYWH5toeFhZGSklLoPrGxsSxYsIABAwaQnZ1NXl4ed999N2+99ZanTdOmTZk7dy6tWrUiPT2dN954g27durFlyxYaNWpUouMCTJ48mfHjxxfYvmLFCvz9/Yvz0YmLiytW+8po50kL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WhZVWloaTqeTsLCwfNvDwsJISUkxqVcV2/m6FlbzAwcOeNr4+PhQtWrVAm30c7kywzAYNWoUN9xwAy1btgRU9+tp69atdO3alezsbAIDA/nkk09o3ry55x9p1fz6WLRoET///DM//vhjgdf0+359dO7cmfnz59O4cWOOHj3KxIkTiY2NZfv27aVec4Way7BYLPmeG4ZRYJtcWyWpuX4uRfPUU0/xyy+/sHbt2gKvqe7XXpMmTdi8eTOnTp3i448/5rHHHmP16tWe11Xza+/gwYM888wzrFixAl9f30u2U+2vrd69e3u+b9WqFV27dqVBgwbMmzePLl26AKVXcw0/FSI0NBSr1VogIaamphZIm3JtnL9S/nI1Dw8PJzc3l5MnT16yjRRuxIgRfPbZZ3z77bfUrl3bs111v358fHxo2LAhHTp0YPLkybRp04Y33nhDNb+O4uPjSU1NJSYmBm9vb7y9vVm9ejVvvvkm3t7entqp9tdXQEAArVq1IjExsdR/3xVqCuHj40NMTAxxcXH5tsfFxREbG2tSryq2evXqER4enq/mubm5rF692lPzmJgYbDZbvjbJycls27ZNP5dLMAyDp556iqVLl/LNN99Qr169fK+r7qXHMAxycnJU8+votttuY+vWrWzevNnz6NChAw8//DCbN2+mfv36qn0pyMnJYefOnURERJT+73uxLiuuRM7f0j1nzhxjx44dxsiRI42AgABj//79Znet3MrIyDA2bdpkbNq0yQCMadOmGZs2bfLcJv/Pf/7TqFKlirF06VJj69atxoMPPljobX+1a9c2Vq5cafz888/GrbfeqlstL+NPf/qTUaVKFWPVqlX5brfMysrytFHdr70xY8YY3333nbFv3z7jl19+MV588UXDy8vLWLFihWEYqnlp+u3dT4ah2l8Pzz33nLFq1Srj119/NdavX2/cddddRlBQkOfvZWnWXKHmMt555x2jbt26ho+Pj9G+fXvPbbBSMt9++60BFHg89thjhmG4b/17+eWXjfDwcMNutxs33nijsXXr1nzvcfbsWeOpp54yqlWrZvj5+Rl33XWXkZSUZMKnKR8KqzdgfPDBB542qvu194c//MHzb0eNGjWM2267zRNoDEM1L00XhxrV/to7P++MzWYzIiMjjfvuu8/Yvn275/XSrLnFMAyjxOeYRERERMoIXVMjIiIiFYJCjYiIiFQICjUiIiJSISjUiIiISIWgUCMiIiIVgkKNiIiIVAgKNSIiIlIhKNSIiIhIhaBQIyIiIhWCQo2IiIhUCAo1IiIiUiEo1IiIiEiF8P9nuSesfsO69wAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(10,500,20),train_score_ls,label = 'train') # 训练\n",
    "plt.plot(range(10,500,20),val_score_ls,label = 'val') # 验证\n",
    "plt.legend()\n",
    "plt.grid()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "id": "74b1ac93",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8299709422997095"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 参数确定，计算acc\n",
    "model = XGBClassifier(\n",
    "    n_estimators=410,    # 树的数量\n",
    "    learning_rate=0.1,   # 学习率\n",
    "    max_depth=6,         # 树的最大深度\n",
    "    use_label_encoder=False, # 避免警告（对sklearn兼容性）\n",
    "    eval_metric=\"logloss\"    # 损失函数\n",
    "    )\n",
    "\n",
    "model.fit(train_X,train_y) \n",
    "score_r = model.score(val_X,val_y)\n",
    "score_r"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "99b212af",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>P</th>\n",
       "      <th>r</th>\n",
       "      <th>f1</th>\n",
       "      <th>S</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.796590</td>\n",
       "      <td>0.880215</td>\n",
       "      <td>0.836317</td>\n",
       "      <td>5944</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.870002</td>\n",
       "      <td>0.781020</td>\n",
       "      <td>0.823113</td>\n",
       "      <td>6101</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          P         r        f1     S\n",
       "0  0.796590  0.880215  0.836317  5944\n",
       "1  0.870002  0.781020  0.823113  6101"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p, r, f1, s = precision_recall_fscore_support(val_y.reshape(-1, 1), model.predict(val_X))\n",
    "pd.DataFrame({'P':p, 'r':r, 'f1':f1, 'S':s})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "98262698",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e4fefb2f",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "c53e757e",
   "metadata": {},
   "source": [
    "### 4.4RandomForestClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "id": "d4923c46",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.ensemble import RandomForestClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "id": "bb993d45",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████████████████████| 8/8 [20:27<00:00, 153.44s/it]\n"
     ]
    }
   ],
   "source": [
    "# 调节参数\n",
    "train_score_ls = []\n",
    "val_score_ls = []\n",
    "\n",
    "for n_estimators in tqdm(range(10,370,50)):\n",
    "    model = RandomForestClassifier(random_state=0,n_estimators=n_estimators)\n",
    "    \n",
    "    model = model.fit(train_X,train_y)\n",
    "    train_score_ls.append(model.score(train_X,train_y))\n",
    "    val_score_ls.append(model.score(val_X,val_y))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "id": "4083bbb4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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QKgBAACmQKgBAACmQKgBAACmQKgBAACmQKgBAACmQKgBAACmQKgBAACmQKgBAACmQKgBAACmQKgBAACmQKgBAACmQKgBAACmQKgBAACmQKgBAACmUKdQs3DhQsXHxyskJESJiYnauHFjtf0XLFigTp06KTQ0VNdff71WrFjhtvy2226TxWLx+BkwYICrz7Rp0zyWR0dH12X4AADAhAJ9XWHVqlWaNGmSFi5cqD59+ujll19WWlqadu/erTZt2nj0X7RokTIzM/XKK6+oZ8+e2rp1qx588EE1a9ZMgwYNkiS9/fbbKi0tda1z9OhRdevWTffee6/btm688UatW7fO9dxqtfo6fAAAYFI+h5qsrCyNGTNGY8eOlSTNmzdPa9as0aJFizR79myP/q+99prGjRun9PR0SVL79u21ZcsWzZkzxxVqmjdv7rZOdna2wsLCPEJNYGAgR2cAAIBXPoWa0tJSbdu2TZMnT3ZrT01NVW5urtd1SkpKFBIS4tYWGhqqrVu3yul0ymazeayzZMkSDRs2TOHh4W7t+/btU2xsrIKDg9W7d2/NmjVL7du3r3K8JSUlKikpcT13OBySJKfTKafT6XWdyvaqlvsDf58Df69fYg6o37/rl5iDhlZ/bcdhMQzDqO1GDx8+rFatWunTTz9VSkqKq33WrFlavny59u7d67HOU089pT//+c96//331b17d23btk0DBgxQYWGhDh8+rJiYGLf+W7duVe/evfXZZ5+pV69ervYPP/xQxcXF6tixo44cOaKZM2dqz5492rVrl6655hqv4502bZqmT5/u0f76668rLCystmUDAIB6VFxcrBEjRujEiROKiIiosp/Pp58kyWKxuD03DMOjrdLUqVNVUFCgpKQkGYahqKgojR49WnPnzvV6TcySJUvUpUsXt0AjSWlpaa7HCQkJSk5OVocOHbR8+XJlZGR43XdmZqbbMofDobi4OKWmplY5KU6nUzk5OerXr5/Xo0j+wN/nwN/rl5gD6vfv+iXmoKHVX3mmpSY+hZrIyEhZrVYVFBS4tRcWFioqKsrrOqGhoVq6dKlefvllHTlyRDExMVq8eLEaN26syMhIt77FxcXKzs7WjBkzahxLeHi4EhIStG/fvir7BAcHKzg42KPdZrPV+CLVpo/Z+fsc+Hv9EnNA/f5dv8QcNJT6azsGnz7SHRQUpMTE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x44pKytLO3fu1PLly13bnDt3rqZOnarXX39d7dq1cx0JatSokRo1aiRJevzxxzVo0CC1adNGhYWFmjlzphwOh0aNGnXRkwAAAK5+Poea9PR0HT16VDNmzJDdbleXLl20evVqtW3bVpJkt9vd7llTVlam5557Tnv37pXNZtPtt9+u3NxctWvXztVn4cKFKi0t1dChQ9329fTTT2vatGmSpIMHD2r48OEqKipSixYtlJSUpC1btrj2CwAA/FudLhSeMGGCJkyY4HXZsmXL3J536tRJeXl51W7vwIEDNe4zOzu7tsMDAAB+qE6hBgAAuCsrK2sw93W5WE6nU4GBgTpz5ozKysou+/5sNpvXT0T7ilADAMBFMAxDBQUFOn78eH0P5ZIxDEPR0dH64Ycfqrxly6XWtGlTRUdHX9T+CDUAAFyEykDTsmVLhYWFXbEQcDmVl5fr1KlTatSokdsnlS8HwzBUXFyswsJCSbqoTzUTagAAqKOysjJXoKnq7vZXo/LycpWWliokJOSyhxqp4p52UsV971q2bFnnU1GXf6QAAJhU5TU0fPXOxaucw4u5LolQAwDARTLDKaf6dinmkFADAABMgVADAAAuSrt27TRv3rz6HgYXCgMA4I9uu+023XTTTZckjHz++ecKDw+/+EFdJEINAADwYBiGzp49q6CgoBr7tmjR4gqMqGacfgIAwM+MHj1aGzZs0AsvvCCLxSKLxaJly5bJYrFozZo16tWrl6KiorRx40Z99913Gjx4sKKiotSoUSP17NlT69atc9vehaefLBaLXn31VQ0ZMkRhYWG67rrr9O677172ugg1AABcQoZhqLj07BX/MQyj1mN84YUXlJycrAcffFB2u112u11xcXGSpCeffFK///3v9dlnn6lr1646deqU7rrrLq1bt055eXnq37+/Bg0a5Pbl1d5Mnz5dv/rVr/TVV1/prrvu0n333af//Oc/FzW3NeH0EwAAl9CPzjJ1/t2aK77f3TP6Kyyodr/WmzRpoqCgIIWFhSk6OlqStGfPHknSjBkz1K9fPzkcDkVERKhFixbq1q2ba92ZM2fqnXfe0bvvvquHH364yn2MHj1aw4cPlyTNmjVLL730krZu3apf/OIXdS2xRhypAQAALj169HB7fvr0aT355JPq3LmzmjZtqkaNGmnPnj01Hqnp2rWr63F4eLgaN27s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+uabb7R161b17t1bx44dU1ZWlnbu3Knly5e7tvnb3/5Wt956q+bMmaPBgwfr73//u9atW6dNmzbVer8AAMC/+Rxq0tPTdfToUc2YMUN2u11dunTR6tWr1bZtW0mS3W53u+NgWVmZnnvuOe3du1c2m0233367cnNz1a5dO1eflJQUZWdn63//9381depUdejQQatWrXLdo6Y2+wUAAP6tThcKT5gwQRMmTPC6bNmyZW7PO3XqpLy8vBq3OXToUA0dOrTO+wUAoL4YPnyZJLy7FHNonquaAAC4wiovYK3tR45Rtco5vJiL0/mWbgAA6shqtapp06YqLCyUJIWFhV2xj0BfTuXl5SotLdWZM2cu+6efDMNQcXGxCgsL1bRpU48b7/mCUAMAwEWIjo6WJFewMQPDMPTjjz8qNDT0ioW0pk2buuayrgg1AABcBIvFopiYGLVs2dI0Xy3hdDr1ySef6NZbb70i9yqy2WwXdYSmEqEGAIBLwGq1XpJfzA2B1WrV2bNnFRISclXdgJELhQEAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCkQagAAgCnUKdQsXLhQ8fHxCgkJUWJiojZu3Fht/5UrV6pbt24KCwtTTEyMHnjgAR09etS1/LbbbpPFYvH4GTBggKvPtGnTPJZHR0fXZfgAAMCEfA41q1at0qRJkzRlyhTl5eWpb9++SktLU35+vtf+mzZt0v33368xY8Zo165deuONN/T5559r7Nixrj5vv/227Ha762fnzp2yWq2699573bZ14403uvXbsWOHr8MHAAAm5XOoycrK0pgxYzR27Fh16tRJ8+bNU1xcnBYtWuS1/5YtW9SuXTs98sgjio+P1y233KJx48bpiy++cPVp3ry5oqOjXT85OTkKCwvzCDWBgYFu/Vq0aOHr8AEAgEn5FGpKS0u1bds2paamurWnpqYqNzfX6zopKSk6ePCgVq9eLcMwdOTIEb355ptup5YutGTJEg0bNkzh4eFu7fv27VNs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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(range(10,370,50),train_score_ls,label = 'train') # 训练\n",
    "plt.plot(range(10,370,50),val_score_ls,label = 'val') # 验证\n",
    "plt.legend()\n",
    "plt.grid()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "id": "95e252b7",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.832461602324616"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 参数确定，计算acc\n",
    "model = RandomForestClassifier(random_state=0,n_estimators=60)\n",
    "\n",
    "model.fit(train_X,train_y) \n",
    "score_r = model.score(val_X,val_y)\n",
    "score_r"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "id": "ae1df92f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>P</th>\n",
       "      <th>r</th>\n",
       "      <th>f1</th>\n",
       "      <th>S</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0.794215</td>\n",
       "      <td>0.891487</td>\n",
       "      <td>0.840044</td>\n",
       "      <td>5944</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0.879955</td>\n",
       "      <td>0.774955</td>\n",
       "      <td>0.824124</td>\n",
       "      <td>6101</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          P         r        f1     S\n",
       "0  0.794215  0.891487  0.840044  5944\n",
       "1  0.879955  0.774955  0.824124  6101"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "p, r, f1, s = precision_recall_fscore_support(val_y.reshape(-1, 1), model.predict(val_X))\n",
    "pd.DataFrame({'P':p, 'r':r, 'f1':f1, 'S':s})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 112,
   "id": "a670cc60",
   "metadata": {},
   "outputs": [],
   "source": [
    "# import pickle\n",
    "# with open(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\12randomforest.pkl','wb') as f:\n",
    "#     pickle.dump(model,f)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e675ffe4",
   "metadata": {},
   "source": [
    "#### 4.2预测特征获取"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 113,
   "id": "0002e8ef",
   "metadata": {},
   "outputs": [],
   "source": [
    "import pickle\n",
    "from tqdm import tqdm"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 114,
   "id": "3a0d0713",
   "metadata": {},
   "outputs": [],
   "source": [
    "with open(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\9node2vec_model.pkl','rb') as f:\n",
    "    n2v_model = pickle.load(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 115,
   "id": "ade8d20f",
   "metadata": {},
   "outputs": [],
   "source": [
    "# data = pd.read_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\4带有前后顺序的未连接边714801.xlsx')\n",
    "with open(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\4带有前后顺序的未连接边711401.pkl','rb') as f:\n",
    "    data = pickle.load(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "id": "eb84c985",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(711401, 3)"
      ]
     },
     "execution_count": 116,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "id": "948d38ce",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Node1</th>\n",
       "      <th>Node2</th>\n",
       "      <th>Connection</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>T8疟疾疫苗抗原设计与开发</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>T4多糖蛋白结合疫苗技术</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>T19植物糖基转移酶工程技术</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>T15人工核酸分子设计技术</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>T13多肽免疫增强剂研发</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "             Node1           Node2  Connection\n",
       "0  S0免疫响应与病毒感染机理研究   T8疟疾疫苗抗原设计与开发           0\n",
       "1  S0免疫响应与病毒感染机理研究    T4多糖蛋白结合疫苗技术           0\n",
       "2  S0免疫响应与病毒感染机理研究  T19植物糖基转移酶工程技术           0\n",
       "3  S0免疫响应与病毒感染机理研究   T15人工核酸分子设计技术           0\n",
       "4  S0免疫响应与病毒感染机理研究    T13多肽免疫增强剂研发           0"
      ]
     },
     "execution_count": 117,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9898736d",
   "metadata": {},
   "source": [
    "#### 4.2.1预测S-T主题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 118,
   "id": "fb05cfb9",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████████| 711401/711401 [00:11<00:00, 63166.00it/s]\n"
     ]
    }
   ],
   "source": [
    "idx_ls = []\n",
    "for i in tqdm(range(data.shape[0])):\n",
    "    node1 = data['Node1'].values[i]\n",
    "    node2 = data['Node2'].values[i]\n",
    "    if (node1.startswith('S')) & (node2.startswith('T')):\n",
    "        idx_ls.append(i)\n",
    "    if (node2.startswith('S')) & (node1.startswith('T')):\n",
    "        idx_ls.append(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 119,
   "id": "33fe894f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "199"
      ]
     },
     "execution_count": 119,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(idx_ls)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 120,
   "id": "0f78bdd0",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_s_t = data.iloc[idx_ls,:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 121,
   "id": "1e05af03",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(199, 3)"
      ]
     },
     "execution_count": 121,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_s_t.drop_duplicates(subset=['Node1','Node2']).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 122,
   "id": "e95b4ae8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 为df_s_t的节点对(边)获取特征\n",
    "edge_features = [(n2v_model.wv[str(i)]+n2v_model.wv[str(j)]) for i,j in zip(df_s_t['Node1'], df_s_t['Node2'])]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 123,
   "id": "fc4e0484",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_s_t = pd.concat([df_s_t.reset_index(drop = True),pd.DataFrame(edge_features)],axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 124,
   "id": "59a26596",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Node1</th>\n",
       "      <th>Node2</th>\n",
       "      <th>Connection</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>...</th>\n",
       "      <th>90</th>\n",
       "      <th>91</th>\n",
       "      <th>92</th>\n",
       "      <th>93</th>\n",
       "      <th>94</th>\n",
       "      <th>95</th>\n",
       "      <th>96</th>\n",
       "      <th>97</th>\n",
       "      <th>98</th>\n",
       "      <th>99</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>T8疟疾疫苗抗原设计与开发</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.285518</td>\n",
       "      <td>-0.012230</td>\n",
       "      <td>0.943923</td>\n",
       "      <td>0.289630</td>\n",
       "      <td>0.338416</td>\n",
       "      <td>-0.855574</td>\n",
       "      <td>0.520029</td>\n",
       "      <td>...</td>\n",
       "      <td>0.714446</td>\n",
       "      <td>0.247721</td>\n",
       "      <td>0.689367</td>\n",
       "      <td>0.550799</td>\n",
       "      <td>1.222298</td>\n",
       "      <td>0.551783</td>\n",
       "      <td>-0.635362</td>\n",
       "      <td>-0.214338</td>\n",
       "      <td>-0.182697</td>\n",
       "      <td>0.583959</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>T4多糖蛋白结合疫苗技术</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.628594</td>\n",
       "      <td>0.243840</td>\n",
       "      <td>0.922422</td>\n",
       "      <td>0.129750</td>\n",
       "      <td>0.137533</td>\n",
       "      <td>-0.701790</td>\n",
       "      <td>0.529117</td>\n",
       "      <td>...</td>\n",
       "      <td>0.680287</td>\n",
       "      <td>0.056171</td>\n",
       "      <td>0.803931</td>\n",
       "      <td>0.088987</td>\n",
       "      <td>1.420139</td>\n",
       "      <td>0.236381</td>\n",
       "      <td>0.043668</td>\n",
       "      <td>-0.032633</td>\n",
       "      <td>0.331126</td>\n",
       "      <td>0.516495</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>T19植物糖基转移酶工程技术</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.652909</td>\n",
       "      <td>1.018881</td>\n",
       "      <td>0.924712</td>\n",
       "      <td>0.601404</td>\n",
       "      <td>0.070059</td>\n",
       "      <td>-1.689218</td>\n",
       "      <td>0.764606</td>\n",
       "      <td>...</td>\n",
       "      <td>0.529295</td>\n",
       "      <td>0.691659</td>\n",
       "      <td>-0.257040</td>\n",
       "      <td>-0.638703</td>\n",
       "      <td>1.191665</td>\n",
       "      <td>0.735071</td>\n",
       "      <td>0.201281</td>\n",
       "      <td>-0.505221</td>\n",
       "      <td>0.731810</td>\n",
       "      <td>0.267675</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>T15人工核酸分子设计技术</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.166157</td>\n",
       "      <td>0.915268</td>\n",
       "      <td>0.082433</td>\n",
       "      <td>1.168993</td>\n",
       "      <td>0.135248</td>\n",
       "      <td>-1.128865</td>\n",
       "      <td>0.645837</td>\n",
       "      <td>...</td>\n",
       "      <td>1.058014</td>\n",
       "      <td>0.394286</td>\n",
       "      <td>-0.149251</td>\n",
       "      <td>0.500193</td>\n",
       "      <td>1.455751</td>\n",
       "      <td>0.011458</td>\n",
       "      <td>-0.721692</td>\n",
       "      <td>-0.401413</td>\n",
       "      <td>-0.511921</td>\n",
       "      <td>0.088245</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>S0免疫响应与病毒感染机理研究</td>\n",
       "      <td>T13多肽免疫增强剂研发</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.145616</td>\n",
       "      <td>1.584530</td>\n",
       "      <td>0.141933</td>\n",
       "      <td>0.519356</td>\n",
       "      <td>-0.444773</td>\n",
       "      <td>-0.837694</td>\n",
       "      <td>0.181624</td>\n",
       "      <td>...</td>\n",
       "      <td>1.223149</td>\n",
       "      <td>0.641125</td>\n",
       "      <td>-0.166475</td>\n",
       "      <td>0.233198</td>\n",
       "      <td>0.679810</td>\n",
       "      <td>0.181372</td>\n",
       "      <td>0.190291</td>\n",
       "      <td>-0.491383</td>\n",
       "      <td>-0.405585</td>\n",
       "      <td>-0.074315</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>194</th>\n",
       "      <td>S15病毒性心肌炎发病机理与治疗研究</td>\n",
       "      <td>T13多肽免疫增强剂研发</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.021580</td>\n",
       "      <td>2.255258</td>\n",
       "      <td>0.286390</td>\n",
       "      <td>0.467890</td>\n",
       "      <td>-0.145402</td>\n",
       "      <td>-0.816851</td>\n",
       "      <td>0.396323</td>\n",
       "      <td>...</td>\n",
       "      <td>1.172078</td>\n",
       "      <td>0.323032</td>\n",
       "      <td>0.144898</td>\n",
       "      <td>0.602626</td>\n",
       "      <td>0.542356</td>\n",
       "      <td>-0.142013</td>\n",
       "      <td>0.172977</td>\n",
       "      <td>-0.211118</td>\n",
       "      <td>-0.245185</td>\n",
       "      <td>-0.787766</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>195</th>\n",
       "      <td>S20幽门螺杆菌感染与胃部疾病机理研究</td>\n",
       "      <td>T13多肽免疫增强剂研发</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.872283</td>\n",
       "      <td>1.861041</td>\n",
       "      <td>-0.702406</td>\n",
       "      <td>-0.524564</td>\n",
       "      <td>-0.788495</td>\n",
       "      <td>-0.711726</td>\n",
       "      <td>0.023400</td>\n",
       "      <td>...</td>\n",
       "      <td>2.193315</td>\n",
       "      <td>1.269342</td>\n",
       "      <td>-0.911725</td>\n",
       "      <td>0.487623</td>\n",
       "      <td>0.742670</td>\n",
       "      <td>0.222895</td>\n",
       "      <td>0.977301</td>\n",
       "      <td>-0.840396</td>\n",
       "      <td>0.058144</td>\n",
       "      <td>-0.754286</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>196</th>\n",
       "      <td>S13妊娠分娩与早产免疫机制研究</td>\n",
       "      <td>T10布鲁氏菌疫苗菌株鉴定技术</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.807673</td>\n",
       "      <td>1.382484</td>\n",
       "      <td>0.275538</td>\n",
       "      <td>-0.147900</td>\n",
       "      <td>0.590298</td>\n",
       "      <td>-1.110939</td>\n",
       "      <td>0.562857</td>\n",
       "      <td>...</td>\n",
       "      <td>1.194129</td>\n",
       "      <td>0.262402</td>\n",
       "      <td>0.328750</td>\n",
       "      <td>0.398169</td>\n",
       "      <td>1.408927</td>\n",
       "      <td>0.511011</td>\n",
       "      <td>-0.066973</td>\n",
       "      <td>-0.264242</td>\n",
       "      <td>-0.114635</td>\n",
       "      <td>0.522617</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>197</th>\n",
       "      <td>S15病毒性心肌炎发病机理与治疗研究</td>\n",
       "      <td>T10布鲁氏菌疫苗菌株鉴定技术</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.374154</td>\n",
       "      <td>1.676791</td>\n",
       "      <td>0.605729</td>\n",
       "      <td>0.550256</td>\n",
       "      <td>0.139950</td>\n",
       "      <td>-1.111459</td>\n",
       "      <td>0.540244</td>\n",
       "      <td>...</td>\n",
       "      <td>0.825565</td>\n",
       "      <td>-0.075371</td>\n",
       "      <td>0.139313</td>\n",
       "      <td>0.714805</td>\n",
       "      <td>1.217186</td>\n",
       "      <td>-0.121147</td>\n",
       "      <td>0.068061</td>\n",
       "      <td>0.137203</td>\n",
       "      <td>-0.132032</td>\n",
       "      <td>0.227710</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>198</th>\n",
       "      <td>S20幽门螺杆菌感染与胃部疾病机理研究</td>\n",
       "      <td>T10布鲁氏菌疫苗菌株鉴定技术</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.224857</td>\n",
       "      <td>1.282574</td>\n",
       "      <td>-0.383067</td>\n",
       "      <td>-0.442198</td>\n",
       "      <td>-0.503143</td>\n",
       "      <td>-1.006334</td>\n",
       "      <td>0.167321</td>\n",
       "      <td>...</td>\n",
       "      <td>1.846802</td>\n",
       "      <td>0.870939</td>\n",
       "      <td>-0.917310</td>\n",
       "      <td>0.599802</td>\n",
       "      <td>1.417499</td>\n",
       "      <td>0.243761</td>\n",
       "      <td>0.872385</td>\n",
       "      <td>-0.492075</td>\n",
       "      <td>0.171297</td>\n",
       "      <td>0.261189</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>199 rows × 103 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                   Node1            Node2  Connection         0         1  \\\n",
       "0        S0免疫响应与病毒感染机理研究    T8疟疾疫苗抗原设计与开发           0 -0.285518 -0.012230   \n",
       "1        S0免疫响应与病毒感染机理研究     T4多糖蛋白结合疫苗技术           0 -0.628594  0.243840   \n",
       "2        S0免疫响应与病毒感染机理研究   T19植物糖基转移酶工程技术           0 -0.652909  1.018881   \n",
       "3        S0免疫响应与病毒感染机理研究    T15人工核酸分子设计技术           0 -0.166157  0.915268   \n",
       "4        S0免疫响应与病毒感染机理研究     T13多肽免疫增强剂研发           0 -1.145616  1.584530   \n",
       "..                   ...              ...         ...       ...       ...   \n",
       "194   S15病毒性心肌炎发病机理与治疗研究     T13多肽免疫增强剂研发           0 -1.021580  2.255258   \n",
       "195  S20幽门螺杆菌感染与胃部疾病机理研究     T13多肽免疫增强剂研发           0 -1.872283  1.861041   \n",
       "196     S13妊娠分娩与早产免疫机制研究  T10布鲁氏菌疫苗菌株鉴定技术           0 -0.807673  1.382484   \n",
       "197   S15病毒性心肌炎发病机理与治疗研究  T10布鲁氏菌疫苗菌株鉴定技术           0 -0.374154  1.676791   \n",
       "198  S20幽门螺杆菌感染与胃部疾病机理研究  T10布鲁氏菌疫苗菌株鉴定技术           0 -1.224857  1.282574   \n",
       "\n",
       "            2         3         4         5         6  ...        90  \\\n",
       "0    0.943923  0.289630  0.338416 -0.855574  0.520029  ...  0.714446   \n",
       "1    0.922422  0.129750  0.137533 -0.701790  0.529117  ...  0.680287   \n",
       "2    0.924712  0.601404  0.070059 -1.689218  0.764606  ...  0.529295   \n",
       "3    0.082433  1.168993  0.135248 -1.128865  0.645837  ...  1.058014   \n",
       "4    0.141933  0.519356 -0.444773 -0.837694  0.181624  ...  1.223149   \n",
       "..        ...       ...       ...       ...       ...  ...       ...   \n",
       "194  0.286390  0.467890 -0.145402 -0.816851  0.396323  ...  1.172078   \n",
       "195 -0.702406 -0.524564 -0.788495 -0.711726  0.023400  ...  2.193315   \n",
       "196  0.275538 -0.147900  0.590298 -1.110939  0.562857  ...  1.194129   \n",
       "197  0.605729  0.550256  0.139950 -1.111459  0.540244  ...  0.825565   \n",
       "198 -0.383067 -0.442198 -0.503143 -1.006334  0.167321  ...  1.846802   \n",
       "\n",
       "           91        92        93        94        95        96        97  \\\n",
       "0    0.247721  0.689367  0.550799  1.222298  0.551783 -0.635362 -0.214338   \n",
       "1    0.056171  0.803931  0.088987  1.420139  0.236381  0.043668 -0.032633   \n",
       "2    0.691659 -0.257040 -0.638703  1.191665  0.735071  0.201281 -0.505221   \n",
       "3    0.394286 -0.149251  0.500193  1.455751  0.011458 -0.721692 -0.401413   \n",
       "4    0.641125 -0.166475  0.233198  0.679810  0.181372  0.190291 -0.491383   \n",
       "..        ...       ...       ...       ...       ...       ...       ...   \n",
       "194  0.323032  0.144898  0.602626  0.542356 -0.142013  0.172977 -0.211118   \n",
       "195  1.269342 -0.911725  0.487623  0.742670  0.222895  0.977301 -0.840396   \n",
       "196  0.262402  0.328750  0.398169  1.408927  0.511011 -0.066973 -0.264242   \n",
       "197 -0.075371  0.139313  0.714805  1.217186 -0.121147  0.068061  0.137203   \n",
       "198  0.870939 -0.917310  0.599802  1.417499  0.243761  0.872385 -0.492075   \n",
       "\n",
       "           98        99  \n",
       "0   -0.182697  0.583959  \n",
       "1    0.331126  0.516495  \n",
       "2    0.731810  0.267675  \n",
       "3   -0.511921  0.088245  \n",
       "4   -0.405585 -0.074315  \n",
       "..        ...       ...  \n",
       "194 -0.245185 -0.787766  \n",
       "195  0.058144 -0.754286  \n",
       "196 -0.114635  0.522617  \n",
       "197 -0.132032  0.227710  \n",
       "198  0.171297  0.261189  \n",
       "\n",
       "[199 rows x 103 columns]"
      ]
     },
     "execution_count": 124,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_s_t"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 125,
   "id": "6b6bdb9e",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_s_t.to_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\12S-T预测集.xlsx',index = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "16cb58b6",
   "metadata": {},
   "source": [
    "#### 4.2.2预测T-I主题"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 126,
   "id": "8a821f35",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████████| 711401/711401 [00:11<00:00, 63479.58it/s]\n"
     ]
    }
   ],
   "source": [
    "idx_ls = []\n",
    "for i in tqdm(range(data.shape[0])):\n",
    "    node1 = data['Node1'].values[i]\n",
    "    node2 = data['Node2'].values[i]\n",
    "    if (node1.startswith('T')) & (node2.startswith('I')):\n",
    "        idx_ls.append(i)\n",
    "    if (node2.startswith('T')) & (node1.startswith('I')):\n",
    "        idx_ls.append(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 128,
   "id": "cb462b23",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "389"
      ]
     },
     "execution_count": 128,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(idx_ls)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 129,
   "id": "029fe8d8",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "df_T_I = data.iloc[idx_ls,:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 130,
   "id": "c6fbe63b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(389, 3)"
      ]
     },
     "execution_count": 130,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_T_I.drop_duplicates(subset=['Node1','Node2']).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 131,
   "id": "6a1cc87c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 为data的节点对(边)获取特征\n",
    "edge_features = [(n2v_model.wv[str(i)]+n2v_model.wv[str(j)]) for i,j in zip(df_T_I['Node1'], df_T_I['Node2'])]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 132,
   "id": "e648d743",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_T_I = pd.concat([df_T_I.reset_index(drop = True),pd.DataFrame(edge_features)],axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 133,
   "id": "a0956e11",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Node1</th>\n",
       "      <th>Node2</th>\n",
       "      <th>Connection</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>...</th>\n",
       "      <th>90</th>\n",
       "      <th>91</th>\n",
       "      <th>92</th>\n",
       "      <th>93</th>\n",
       "      <th>94</th>\n",
       "      <th>95</th>\n",
       "      <th>96</th>\n",
       "      <th>97</th>\n",
       "      <th>98</th>\n",
       "      <th>99</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>T8疟疾疫苗抗原设计与开发</td>\n",
       "      <td>I6脑膜炎球菌结合疫苗</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.549166</td>\n",
       "      <td>0.569388</td>\n",
       "      <td>-0.273661</td>\n",
       "      <td>-0.047302</td>\n",
       "      <td>0.449314</td>\n",
       "      <td>-0.512811</td>\n",
       "      <td>0.939729</td>\n",
       "      <td>...</td>\n",
       "      <td>1.136086</td>\n",
       "      <td>-0.215056</td>\n",
       "      <td>1.000863</td>\n",
       "      <td>1.104887</td>\n",
       "      <td>0.857050</td>\n",
       "      <td>0.363778</td>\n",
       "      <td>-0.578030</td>\n",
       "      <td>-0.417628</td>\n",
       "      <td>-0.377852</td>\n",
       "      <td>0.245422</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>T8疟疾疫苗抗原设计与开发</td>\n",
       "      <td>I26轮状病毒疫苗</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.258542</td>\n",
       "      <td>0.028464</td>\n",
       "      <td>0.526489</td>\n",
       "      <td>-0.349560</td>\n",
       "      <td>1.070804</td>\n",
       "      <td>-1.019938</td>\n",
       "      <td>0.397935</td>\n",
       "      <td>...</td>\n",
       "      <td>0.998869</td>\n",
       "      <td>0.688719</td>\n",
       "      <td>1.033867</td>\n",
       "      <td>1.351392</td>\n",
       "      <td>1.252744</td>\n",
       "      <td>0.688017</td>\n",
       "      <td>-0.843525</td>\n",
       "      <td>-0.010216</td>\n",
       "      <td>0.043291</td>\n",
       "      <td>0.294406</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>T8疟疾疫苗抗原设计与开发</td>\n",
       "      <td>I1重组新冠疫苗</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.487754</td>\n",
       "      <td>0.617513</td>\n",
       "      <td>-0.062511</td>\n",
       "      <td>-0.008060</td>\n",
       "      <td>0.247495</td>\n",
       "      <td>-0.782969</td>\n",
       "      <td>0.886843</td>\n",
       "      <td>...</td>\n",
       "      <td>0.908291</td>\n",
       "      <td>-0.063589</td>\n",
       "      <td>0.807134</td>\n",
       "      <td>1.129501</td>\n",
       "      <td>0.782116</td>\n",
       "      <td>0.241564</td>\n",
       "      <td>-0.532233</td>\n",
       "      <td>-0.817979</td>\n",
       "      <td>-0.014254</td>\n",
       "      <td>0.283872</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>T8疟疾疫苗抗原设计与开发</td>\n",
       "      <td>I5核酸新冠疫苗</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.761963</td>\n",
       "      <td>0.460372</td>\n",
       "      <td>0.481008</td>\n",
       "      <td>-0.040350</td>\n",
       "      <td>0.351395</td>\n",
       "      <td>-0.259907</td>\n",
       "      <td>-0.146949</td>\n",
       "      <td>...</td>\n",
       "      <td>1.443683</td>\n",
       "      <td>0.148097</td>\n",
       "      <td>1.300022</td>\n",
       "      <td>1.668811</td>\n",
       "      <td>1.342515</td>\n",
       "      <td>0.828606</td>\n",
       "      <td>-0.575023</td>\n",
       "      <td>-0.058107</td>\n",
       "      <td>-0.176481</td>\n",
       "      <td>0.585800</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>T8疟疾疫苗抗原设计与开发</td>\n",
       "      <td>I7肺炎球菌疫苗</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.915354</td>\n",
       "      <td>0.526996</td>\n",
       "      <td>0.382315</td>\n",
       "      <td>0.416726</td>\n",
       "      <td>0.472492</td>\n",
       "      <td>-0.097892</td>\n",
       "      <td>0.542577</td>\n",
       "      <td>...</td>\n",
       "      <td>1.424717</td>\n",
       "      <td>-0.282856</td>\n",
       "      <td>1.030860</td>\n",
       "      <td>1.155380</td>\n",
       "      <td>0.691205</td>\n",
       "      <td>0.984658</td>\n",
       "      <td>-0.681438</td>\n",
       "      <td>0.236888</td>\n",
       "      <td>-0.185779</td>\n",
       "      <td>0.415795</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>384</th>\n",
       "      <td>T14Cbl-b抑制剂癌症治疗技术创新</td>\n",
       "      <td>I5核酸新冠疫苗</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.690063</td>\n",
       "      <td>0.877957</td>\n",
       "      <td>-0.010444</td>\n",
       "      <td>0.268386</td>\n",
       "      <td>0.303333</td>\n",
       "      <td>-0.285308</td>\n",
       "      <td>0.244965</td>\n",
       "      <td>...</td>\n",
       "      <td>1.075448</td>\n",
       "      <td>0.452046</td>\n",
       "      <td>1.328361</td>\n",
       "      <td>1.995892</td>\n",
       "      <td>1.425581</td>\n",
       "      <td>1.012187</td>\n",
       "      <td>-0.295457</td>\n",
       "      <td>0.341307</td>\n",
       "      <td>0.871630</td>\n",
       "      <td>-0.070104</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>385</th>\n",
       "      <td>T14Cbl-b抑制剂癌症治疗技术创新</td>\n",
       "      <td>I7肺炎球菌疫苗</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.843453</td>\n",
       "      <td>0.944581</td>\n",
       "      <td>-0.109137</td>\n",
       "      <td>0.725461</td>\n",
       "      <td>0.424429</td>\n",
       "      <td>-0.123294</td>\n",
       "      <td>0.934491</td>\n",
       "      <td>...</td>\n",
       "      <td>1.056482</td>\n",
       "      <td>0.021094</td>\n",
       "      <td>1.059199</td>\n",
       "      <td>1.482461</td>\n",
       "      <td>0.774270</td>\n",
       "      <td>1.168239</td>\n",
       "      <td>-0.401872</td>\n",
       "      <td>0.636302</td>\n",
       "      <td>0.862332</td>\n",
       "      <td>-0.240109</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>386</th>\n",
       "      <td>T11HIV逆转录酶抑制剂组合疗法研发</td>\n",
       "      <td>I21水痘减毒活疫苗</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.203440</td>\n",
       "      <td>-0.288962</td>\n",
       "      <td>-0.008590</td>\n",
       "      <td>0.007848</td>\n",
       "      <td>1.251317</td>\n",
       "      <td>-1.359058</td>\n",
       "      <td>0.404910</td>\n",
       "      <td>...</td>\n",
       "      <td>1.294677</td>\n",
       "      <td>0.172581</td>\n",
       "      <td>0.528916</td>\n",
       "      <td>1.293035</td>\n",
       "      <td>1.636138</td>\n",
       "      <td>0.659264</td>\n",
       "      <td>0.067904</td>\n",
       "      <td>0.086253</td>\n",
       "      <td>0.121790</td>\n",
       "      <td>0.010156</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>387</th>\n",
       "      <td>T14Cbl-b抑制剂癌症治疗技术创新</td>\n",
       "      <td>I21水痘减毒活疫苗</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.332986</td>\n",
       "      <td>-0.056955</td>\n",
       "      <td>0.277267</td>\n",
       "      <td>-0.066321</td>\n",
       "      <td>0.966649</td>\n",
       "      <td>-1.049204</td>\n",
       "      <td>0.688636</td>\n",
       "      <td>...</td>\n",
       "      <td>1.116073</td>\n",
       "      <td>0.750260</td>\n",
       "      <td>1.171501</td>\n",
       "      <td>1.375171</td>\n",
       "      <td>1.510042</td>\n",
       "      <td>0.703736</td>\n",
       "      <td>-0.632389</td>\n",
       "      <td>0.291976</td>\n",
       "      <td>0.766162</td>\n",
       "      <td>-0.465527</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>388</th>\n",
       "      <td>T14Cbl-b抑制剂癌症治疗技术创新</td>\n",
       "      <td>I23埃博拉病毒疫苗</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.460017</td>\n",
       "      <td>1.037480</td>\n",
       "      <td>-0.788285</td>\n",
       "      <td>0.283201</td>\n",
       "      <td>0.306839</td>\n",
       "      <td>-0.677053</td>\n",
       "      <td>1.364036</td>\n",
       "      <td>...</td>\n",
       "      <td>0.689599</td>\n",
       "      <td>0.056254</td>\n",
       "      <td>0.998508</td>\n",
       "      <td>1.409084</td>\n",
       "      <td>0.937516</td>\n",
       "      <td>0.288410</td>\n",
       "      <td>-0.342056</td>\n",
       "      <td>-0.238149</td>\n",
       "      <td>0.768853</td>\n",
       "      <td>-0.421194</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>389 rows × 103 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                   Node1        Node2  Connection         0         1  \\\n",
       "0          T8疟疾疫苗抗原设计与开发  I6脑膜炎球菌结合疫苗           0 -0.549166  0.569388   \n",
       "1          T8疟疾疫苗抗原设计与开发    I26轮状病毒疫苗           0 -1.258542  0.028464   \n",
       "2          T8疟疾疫苗抗原设计与开发     I1重组新冠疫苗           0 -0.487754  0.617513   \n",
       "3          T8疟疾疫苗抗原设计与开发     I5核酸新冠疫苗           0 -0.761963  0.460372   \n",
       "4          T8疟疾疫苗抗原设计与开发     I7肺炎球菌疫苗           0 -0.915354  0.526996   \n",
       "..                   ...          ...         ...       ...       ...   \n",
       "384  T14Cbl-b抑制剂癌症治疗技术创新     I5核酸新冠疫苗           0 -0.690063  0.877957   \n",
       "385  T14Cbl-b抑制剂癌症治疗技术创新     I7肺炎球菌疫苗           0 -0.843453  0.944581   \n",
       "386  T11HIV逆转录酶抑制剂组合疗法研发   I21水痘减毒活疫苗           0 -1.203440 -0.288962   \n",
       "387  T14Cbl-b抑制剂癌症治疗技术创新   I21水痘减毒活疫苗           0 -1.332986 -0.056955   \n",
       "388  T14Cbl-b抑制剂癌症治疗技术创新   I23埃博拉病毒疫苗           0 -0.460017  1.037480   \n",
       "\n",
       "            2         3         4         5         6  ...        90  \\\n",
       "0   -0.273661 -0.047302  0.449314 -0.512811  0.939729  ...  1.136086   \n",
       "1    0.526489 -0.349560  1.070804 -1.019938  0.397935  ...  0.998869   \n",
       "2   -0.062511 -0.008060  0.247495 -0.782969  0.886843  ...  0.908291   \n",
       "3    0.481008 -0.040350  0.351395 -0.259907 -0.146949  ...  1.443683   \n",
       "4    0.382315  0.416726  0.472492 -0.097892  0.542577  ...  1.424717   \n",
       "..        ...       ...       ...       ...       ...  ...       ...   \n",
       "384 -0.010444  0.268386  0.303333 -0.285308  0.244965  ...  1.075448   \n",
       "385 -0.109137  0.725461  0.424429 -0.123294  0.934491  ...  1.056482   \n",
       "386 -0.008590  0.007848  1.251317 -1.359058  0.404910  ...  1.294677   \n",
       "387  0.277267 -0.066321  0.966649 -1.049204  0.688636  ...  1.116073   \n",
       "388 -0.788285  0.283201  0.306839 -0.677053  1.364036  ...  0.689599   \n",
       "\n",
       "           91        92        93        94        95        96        97  \\\n",
       "0   -0.215056  1.000863  1.104887  0.857050  0.363778 -0.578030 -0.417628   \n",
       "1    0.688719  1.033867  1.351392  1.252744  0.688017 -0.843525 -0.010216   \n",
       "2   -0.063589  0.807134  1.129501  0.782116  0.241564 -0.532233 -0.817979   \n",
       "3    0.148097  1.300022  1.668811  1.342515  0.828606 -0.575023 -0.058107   \n",
       "4   -0.282856  1.030860  1.155380  0.691205  0.984658 -0.681438  0.236888   \n",
       "..        ...       ...       ...       ...       ...       ...       ...   \n",
       "384  0.452046  1.328361  1.995892  1.425581  1.012187 -0.295457  0.341307   \n",
       "385  0.021094  1.059199  1.482461  0.774270  1.168239 -0.401872  0.636302   \n",
       "386  0.172581  0.528916  1.293035  1.636138  0.659264  0.067904  0.086253   \n",
       "387  0.750260  1.171501  1.375171  1.510042  0.703736 -0.632389  0.291976   \n",
       "388  0.056254  0.998508  1.409084  0.937516  0.288410 -0.342056 -0.238149   \n",
       "\n",
       "           98        99  \n",
       "0   -0.377852  0.245422  \n",
       "1    0.043291  0.294406  \n",
       "2   -0.014254  0.283872  \n",
       "3   -0.176481  0.585800  \n",
       "4   -0.185779  0.415795  \n",
       "..        ...       ...  \n",
       "384  0.871630 -0.070104  \n",
       "385  0.862332 -0.240109  \n",
       "386  0.121790  0.010156  \n",
       "387  0.766162 -0.465527  \n",
       "388  0.768853 -0.421194  \n",
       "\n",
       "[389 rows x 103 columns]"
      ]
     },
     "execution_count": 133,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_T_I"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "id": "b8322d8f",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_T_I.to_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\12T-I预测集.xlsx',index = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f4dfaf30",
   "metadata": {},
   "source": [
    "#### 4.2.3预测S-T主体"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "id": "caa51802",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████████| 711401/711401 [00:11<00:00, 61339.00it/s]\n"
     ]
    }
   ],
   "source": [
    "idx_ls = []\n",
    "for i in tqdm(range(data.shape[0])):\n",
    "    node1 = data['Node1'].values[i]\n",
    "    node2 = data['Node2'].values[i]\n",
    "    if (node1.endswith('_paper')) & (node2.endswith('_patent')):\n",
    "        idx_ls.append(i)\n",
    "    if (node2.endswith('_paper')) & (node1.endswith('_patent')):\n",
    "        idx_ls.append(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "id": "63cf29b0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "677196"
      ]
     },
     "execution_count": 136,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(idx_ls)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "id": "a5758fe5",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_paper_patent = data.iloc[idx_ls,:]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 138,
   "id": "9f846e5c",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(677196, 3)"
      ]
     },
     "execution_count": 138,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_paper_patent.drop_duplicates(subset=['Node1','Node2']).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 139,
   "id": "ebb7e726",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 为data的节点对(边)获取特征\n",
    "edge_features = [(n2v_model.wv[str(i)]+n2v_model.wv[str(j)]) for i,j in zip(df_paper_patent['Node1'], df_paper_patent['Node2'])]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 140,
   "id": "50c8f133",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_paper_patent = pd.concat([df_paper_patent.reset_index(drop = True),pd.DataFrame(edge_features)],axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 141,
   "id": "4c3305a4",
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Node1</th>\n",
       "      <th>Node2</th>\n",
       "      <th>Connection</th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "      <th>5</th>\n",
       "      <th>6</th>\n",
       "      <th>...</th>\n",
       "      <th>90</th>\n",
       "      <th>91</th>\n",
       "      <th>92</th>\n",
       "      <th>93</th>\n",
       "      <th>94</th>\n",
       "      <th>95</th>\n",
       "      <th>96</th>\n",
       "      <th>97</th>\n",
       "      <th>98</th>\n",
       "      <th>99</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>四川省动物疾病与人类健康重点实验室_paper</td>\n",
       "      <td>centro de inmunología molecular_patent</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.452307</td>\n",
       "      <td>0.950833</td>\n",
       "      <td>0.310361</td>\n",
       "      <td>-0.078930</td>\n",
       "      <td>0.414523</td>\n",
       "      <td>-0.927722</td>\n",
       "      <td>0.260811</td>\n",
       "      <td>...</td>\n",
       "      <td>0.956091</td>\n",
       "      <td>-0.057256</td>\n",
       "      <td>0.433226</td>\n",
       "      <td>0.486079</td>\n",
       "      <td>0.654742</td>\n",
       "      <td>-0.319673</td>\n",
       "      <td>-0.184018</td>\n",
       "      <td>-0.456857</td>\n",
       "      <td>-0.404233</td>\n",
       "      <td>0.414161</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>四川省动物疾病与人类健康重点实验室_paper</td>\n",
       "      <td>anna university chennai_patent</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.830614</td>\n",
       "      <td>0.903735</td>\n",
       "      <td>0.494231</td>\n",
       "      <td>0.021315</td>\n",
       "      <td>0.540107</td>\n",
       "      <td>-0.286131</td>\n",
       "      <td>0.041497</td>\n",
       "      <td>...</td>\n",
       "      <td>0.507972</td>\n",
       "      <td>0.322512</td>\n",
       "      <td>0.845424</td>\n",
       "      <td>0.567820</td>\n",
       "      <td>0.361063</td>\n",
       "      <td>0.749813</td>\n",
       "      <td>-0.227902</td>\n",
       "      <td>0.042415</td>\n",
       "      <td>0.139479</td>\n",
       "      <td>0.161658</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>四川省动物疾病与人类健康重点实验室_paper</td>\n",
       "      <td>kazakh national agrarian research university_p...</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.433964</td>\n",
       "      <td>1.018211</td>\n",
       "      <td>0.262146</td>\n",
       "      <td>-0.058717</td>\n",
       "      <td>0.421349</td>\n",
       "      <td>-1.001554</td>\n",
       "      <td>0.278736</td>\n",
       "      <td>...</td>\n",
       "      <td>0.872056</td>\n",
       "      <td>-0.049196</td>\n",
       "      <td>0.411574</td>\n",
       "      <td>0.525471</td>\n",
       "      <td>0.722349</td>\n",
       "      <td>-0.372665</td>\n",
       "      <td>-0.249623</td>\n",
       "      <td>-0.513845</td>\n",
       "      <td>-0.418102</td>\n",
       "      <td>0.398673</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>四川省动物疾病与人类健康重点实验室_paper</td>\n",
       "      <td>anna university_patent</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.906119</td>\n",
       "      <td>0.874918</td>\n",
       "      <td>0.442898</td>\n",
       "      <td>0.093857</td>\n",
       "      <td>0.485850</td>\n",
       "      <td>-0.253276</td>\n",
       "      <td>0.112237</td>\n",
       "      <td>...</td>\n",
       "      <td>0.514561</td>\n",
       "      <td>0.288637</td>\n",
       "      <td>0.933682</td>\n",
       "      <td>0.580827</td>\n",
       "      <td>0.391493</td>\n",
       "      <td>0.761967</td>\n",
       "      <td>-0.108755</td>\n",
       "      <td>0.136306</td>\n",
       "      <td>0.217326</td>\n",
       "      <td>0.132276</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>四川省动物疾病与人类健康重点实验室_paper</td>\n",
       "      <td>baxter healthcare s a_patent</td>\n",
       "      <td>0</td>\n",
       "      <td>-0.645930</td>\n",
       "      <td>0.917665</td>\n",
       "      <td>0.375088</td>\n",
       "      <td>0.211967</td>\n",
       "      <td>0.405803</td>\n",
       "      <td>-0.897243</td>\n",
       "      <td>0.568614</td>\n",
       "      <td>...</td>\n",
       "      <td>1.105710</td>\n",
       "      <td>0.325421</td>\n",
       "      <td>0.214238</td>\n",
       "      <td>0.983511</td>\n",
       "      <td>0.770028</td>\n",
       "      <td>0.137044</td>\n",
       "      <td>0.613959</td>\n",
       "      <td>0.055479</td>\n",
       "      <td>-0.227959</td>\n",
       "      <td>0.658012</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>677191</th>\n",
       "      <td>广州大学_paper</td>\n",
       "      <td>the institute for genomic research_patent</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.043918</td>\n",
       "      <td>0.614240</td>\n",
       "      <td>0.741148</td>\n",
       "      <td>-0.072833</td>\n",
       "      <td>0.506227</td>\n",
       "      <td>-0.689154</td>\n",
       "      <td>0.350893</td>\n",
       "      <td>...</td>\n",
       "      <td>0.788920</td>\n",
       "      <td>-0.245382</td>\n",
       "      <td>1.047535</td>\n",
       "      <td>0.343458</td>\n",
       "      <td>0.662357</td>\n",
       "      <td>-0.013057</td>\n",
       "      <td>0.427815</td>\n",
       "      <td>-0.175904</td>\n",
       "      <td>0.225855</td>\n",
       "      <td>0.433281</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>677192</th>\n",
       "      <td>广州市生物医药卫生研究院_paper_paper</td>\n",
       "      <td>the provost fellows and scholars of the colleg...</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.488116</td>\n",
       "      <td>1.306844</td>\n",
       "      <td>0.771301</td>\n",
       "      <td>0.555584</td>\n",
       "      <td>0.228720</td>\n",
       "      <td>-0.279929</td>\n",
       "      <td>0.403404</td>\n",
       "      <td>...</td>\n",
       "      <td>1.043102</td>\n",
       "      <td>-0.088496</td>\n",
       "      <td>0.682677</td>\n",
       "      <td>0.353208</td>\n",
       "      <td>0.200644</td>\n",
       "      <td>0.993048</td>\n",
       "      <td>-0.545613</td>\n",
       "      <td>0.288646</td>\n",
       "      <td>0.094042</td>\n",
       "      <td>0.302900</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>677193</th>\n",
       "      <td>广州大学_paper</td>\n",
       "      <td>the provost fellows and scholars of the colleg...</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.480545</td>\n",
       "      <td>1.352131</td>\n",
       "      <td>0.804085</td>\n",
       "      <td>0.694258</td>\n",
       "      <td>0.315949</td>\n",
       "      <td>-0.347263</td>\n",
       "      <td>0.369708</td>\n",
       "      <td>...</td>\n",
       "      <td>1.062935</td>\n",
       "      <td>-0.107963</td>\n",
       "      <td>0.777778</td>\n",
       "      <td>0.336306</td>\n",
       "      <td>0.138697</td>\n",
       "      <td>0.957794</td>\n",
       "      <td>-0.522199</td>\n",
       "      <td>0.382504</td>\n",
       "      <td>0.046788</td>\n",
       "      <td>0.311791</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>677194</th>\n",
       "      <td>广州市生物医药卫生研究院_paper_paper</td>\n",
       "      <td>the united state of america as represented by ...</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.157406</td>\n",
       "      <td>1.064352</td>\n",
       "      <td>0.612946</td>\n",
       "      <td>0.387283</td>\n",
       "      <td>0.346488</td>\n",
       "      <td>-0.163235</td>\n",
       "      <td>0.233670</td>\n",
       "      <td>...</td>\n",
       "      <td>0.699108</td>\n",
       "      <td>0.027905</td>\n",
       "      <td>0.813482</td>\n",
       "      <td>0.464413</td>\n",
       "      <td>0.239580</td>\n",
       "      <td>0.847398</td>\n",
       "      <td>-0.372951</td>\n",
       "      <td>0.284390</td>\n",
       "      <td>0.125581</td>\n",
       "      <td>0.196496</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>677195</th>\n",
       "      <td>广州大学_paper</td>\n",
       "      <td>the united state of america as represented by ...</td>\n",
       "      <td>0</td>\n",
       "      <td>-1.149835</td>\n",
       "      <td>1.109639</td>\n",
       "      <td>0.645730</td>\n",
       "      <td>0.525957</td>\n",
       "      <td>0.433717</td>\n",
       "      <td>-0.230568</td>\n",
       "      <td>0.199974</td>\n",
       "      <td>...</td>\n",
       "      <td>0.718942</td>\n",
       "      <td>0.008438</td>\n",
       "      <td>0.908583</td>\n",
       "      <td>0.447511</td>\n",
       "      <td>0.177634</td>\n",
       "      <td>0.812144</td>\n",
       "      <td>-0.349536</td>\n",
       "      <td>0.378247</td>\n",
       "      <td>0.078327</td>\n",
       "      <td>0.205386</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>677196 rows × 103 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "                           Node1  \\\n",
       "0        四川省动物疾病与人类健康重点实验室_paper   \n",
       "1        四川省动物疾病与人类健康重点实验室_paper   \n",
       "2        四川省动物疾病与人类健康重点实验室_paper   \n",
       "3        四川省动物疾病与人类健康重点实验室_paper   \n",
       "4        四川省动物疾病与人类健康重点实验室_paper   \n",
       "...                          ...   \n",
       "677191                广州大学_paper   \n",
       "677192  广州市生物医药卫生研究院_paper_paper   \n",
       "677193                广州大学_paper   \n",
       "677194  广州市生物医药卫生研究院_paper_paper   \n",
       "677195                广州大学_paper   \n",
       "\n",
       "                                                    Node2  Connection  \\\n",
       "0                  centro de inmunología molecular_patent           0   \n",
       "1                          anna university chennai_patent           0   \n",
       "2       kazakh national agrarian research university_p...           0   \n",
       "3                                  anna university_patent           0   \n",
       "4                            baxter healthcare s a_patent           0   \n",
       "...                                                   ...         ...   \n",
       "677191          the institute for genomic research_patent           0   \n",
       "677192  the provost fellows and scholars of the colleg...           0   \n",
       "677193  the provost fellows and scholars of the colleg...           0   \n",
       "677194  the united state of america as represented by ...           0   \n",
       "677195  the united state of america as represented by ...           0   \n",
       "\n",
       "               0         1         2         3         4         5         6  \\\n",
       "0      -0.452307  0.950833  0.310361 -0.078930  0.414523 -0.927722  0.260811   \n",
       "1      -0.830614  0.903735  0.494231  0.021315  0.540107 -0.286131  0.041497   \n",
       "2      -0.433964  1.018211  0.262146 -0.058717  0.421349 -1.001554  0.278736   \n",
       "3      -0.906119  0.874918  0.442898  0.093857  0.485850 -0.253276  0.112237   \n",
       "4      -0.645930  0.917665  0.375088  0.211967  0.405803 -0.897243  0.568614   \n",
       "...          ...       ...       ...       ...       ...       ...       ...   \n",
       "677191 -1.043918  0.614240  0.741148 -0.072833  0.506227 -0.689154  0.350893   \n",
       "677192 -1.488116  1.306844  0.771301  0.555584  0.228720 -0.279929  0.403404   \n",
       "677193 -1.480545  1.352131  0.804085  0.694258  0.315949 -0.347263  0.369708   \n",
       "677194 -1.157406  1.064352  0.612946  0.387283  0.346488 -0.163235  0.233670   \n",
       "677195 -1.149835  1.109639  0.645730  0.525957  0.433717 -0.230568  0.199974   \n",
       "\n",
       "        ...        90        91        92        93        94        95  \\\n",
       "0       ...  0.956091 -0.057256  0.433226  0.486079  0.654742 -0.319673   \n",
       "1       ...  0.507972  0.322512  0.845424  0.567820  0.361063  0.749813   \n",
       "2       ...  0.872056 -0.049196  0.411574  0.525471  0.722349 -0.372665   \n",
       "3       ...  0.514561  0.288637  0.933682  0.580827  0.391493  0.761967   \n",
       "4       ...  1.105710  0.325421  0.214238  0.983511  0.770028  0.137044   \n",
       "...     ...       ...       ...       ...       ...       ...       ...   \n",
       "677191  ...  0.788920 -0.245382  1.047535  0.343458  0.662357 -0.013057   \n",
       "677192  ...  1.043102 -0.088496  0.682677  0.353208  0.200644  0.993048   \n",
       "677193  ...  1.062935 -0.107963  0.777778  0.336306  0.138697  0.957794   \n",
       "677194  ...  0.699108  0.027905  0.813482  0.464413  0.239580  0.847398   \n",
       "677195  ...  0.718942  0.008438  0.908583  0.447511  0.177634  0.812144   \n",
       "\n",
       "              96        97        98        99  \n",
       "0      -0.184018 -0.456857 -0.404233  0.414161  \n",
       "1      -0.227902  0.042415  0.139479  0.161658  \n",
       "2      -0.249623 -0.513845 -0.418102  0.398673  \n",
       "3      -0.108755  0.136306  0.217326  0.132276  \n",
       "4       0.613959  0.055479 -0.227959  0.658012  \n",
       "...          ...       ...       ...       ...  \n",
       "677191  0.427815 -0.175904  0.225855  0.433281  \n",
       "677192 -0.545613  0.288646  0.094042  0.302900  \n",
       "677193 -0.522199  0.382504  0.046788  0.311791  \n",
       "677194 -0.372951  0.284390  0.125581  0.196496  \n",
       "677195 -0.349536  0.378247  0.078327  0.205386  \n",
       "\n",
       "[677196 rows x 103 columns]"
      ]
     },
     "execution_count": 141,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_paper_patent"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "id": "d6ea3ab2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# with open(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\12主体S-T预测集.pkl','wb') as f:\n",
    "#     pickle.dump(df_paper_patent,f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "ebc588aa",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "90092307",
   "metadata": {},
   "outputs": [],
   "source": [
    "# df_paper_patent.to_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\12主体S-T预测集.xlsx',index = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f5642d5c",
   "metadata": {},
   "source": [
    "#### 4.2.4预测T-I主体"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 143,
   "id": "37eb27f3",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|███████████████████████████████████████████████████████████████████████| 711401/711401 [00:11<00:00, 61848.49it/s]\n"
     ]
    }
   ],
   "source": [
    "idx_ls = []\n",
    "for i in tqdm(range(data.shape[0])):\n",
    "    node1 = data['Node1'].values[i]\n",
    "    node2 = data['Node2'].values[i]\n",
    "    if (node1.endswith('_patent')) & (node2.endswith('_product')):\n",
    "        idx_ls.append(i)\n",
    "    if (node2.endswith('_patent')) & (node1.endswith('_product')):\n",
    "        idx_ls.append(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "id": "a0726ea4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "10018"
      ]
     },
     "execution_count": 144,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(idx_ls)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 145,
   "id": "6d49b851",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(10018, 3)"
      ]
     },
     "execution_count": 145,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_patent_product = data.iloc[idx_ls,:]\n",
    "df_patent_product.drop_duplicates(subset=['Node1','Node2']).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "id": "49856b2d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 为data的节点对(边)获取特征\n",
    "edge_features = [(n2v_model.wv[str(i)]+n2v_model.wv[str(j)]) for i,j in zip(df_patent_product['Node1'], df_patent_product['Node2'])]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 147,
   "id": "7a549bd4",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_patent_product = pd.concat([df_patent_product.reset_index(drop = True),pd.DataFrame(edge_features)],axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "196b173e",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 148,
   "id": "d4918dea",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_patent_product.to_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\12主体T-I预测集.xlsx',index = False)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "add532e9",
   "metadata": {},
   "source": [
    "#### 4.2.5预测T主题-I主体"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 149,
   "id": "fa3f1dbb",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 没有重复\n",
    "import pickle\n",
    "with open(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\3未连接边2257971.pkl','rb') as f:\n",
    "    df1_ = pickle.load(f)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 150,
   "id": "7880e37f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(2257971, 3)"
      ]
     },
     "execution_count": 150,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df1_.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 151,
   "id": "47d98588",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|█████████████████████████████████████████████████████████████████████| 2257971/2257971 [00:35<00:00, 62799.73it/s]\n"
     ]
    }
   ],
   "source": [
    "idx_ls = []\n",
    "for i in tqdm(range(df1_.shape[0])):\n",
    "    node1 = df1_['Node1'].values[i]\n",
    "    node2 = df1_['Node2'].values[i]\n",
    "    if (node1.startswith('T')) & (node2.endswith('_product')):\n",
    "        idx_ls.append(i)\n",
    "    if (node2.endswith('T')) & (node1.startswith('_product')):\n",
    "        idx_ls.append(i)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 152,
   "id": "00a4a246",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "432"
      ]
     },
     "execution_count": 152,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "len(idx_ls)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 153,
   "id": "75597a1e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(432, 3)"
      ]
     },
     "execution_count": 153,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_patent_product = df1_.iloc[idx_ls,:]\n",
    "df_patent_product.drop_duplicates(subset=['Node1','Node2']).shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 154,
   "id": "6a86c979",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 为data的节点对(边)获取特征\n",
    "edge_features = [(n2v_model.wv[str(i)]+n2v_model.wv[str(j)]) for i,j in zip(df_patent_product['Node1'], df_patent_product['Node2'])]\n",
    "df_patent_product = pd.concat([df_patent_product.reset_index(drop = True),pd.DataFrame(edge_features)],axis = 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 155,
   "id": "638baefb",
   "metadata": {},
   "outputs": [],
   "source": [
    "df_patent_product.to_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\12主题T-主体I预测集.xlsx',index = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "96883521",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "d9642c8b",
   "metadata": {},
   "source": [
    "- 检查到底有多少节点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 156,
   "id": "77694e66",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-1 {color: black;background-color: white;}#sk-container-id-1 pre{padding: 0;}#sk-container-id-1 div.sk-toggleable {background-color: white;}#sk-container-id-1 label.sk-toggleable__label {cursor: pointer;display: block;width: 100%;margin-bottom: 0;padding: 0.3em;box-sizing: border-box;text-align: center;}#sk-container-id-1 label.sk-toggleable__label-arrow:before {content: \"▸\";float: left;margin-right: 0.25em;color: #696969;}#sk-container-id-1 label.sk-toggleable__label-arrow:hover:before {color: black;}#sk-container-id-1 div.sk-estimator:hover label.sk-toggleable__label-arrow:before {color: black;}#sk-container-id-1 div.sk-toggleable__content {max-height: 0;max-width: 0;overflow: hidden;text-align: left;background-color: #f0f8ff;}#sk-container-id-1 div.sk-toggleable__content pre {margin: 0.2em;color: black;border-radius: 0.25em;background-color: #f0f8ff;}#sk-container-id-1 input.sk-toggleable__control:checked~div.sk-toggleable__content {max-height: 200px;max-width: 100%;overflow: auto;}#sk-container-id-1 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {content: \"▾\";}#sk-container-id-1 div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 input.sk-hidden--visually {border: 0;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);height: 1px;margin: -1px;overflow: hidden;padding: 0;position: absolute;width: 1px;}#sk-container-id-1 div.sk-estimator {font-family: monospace;background-color: #f0f8ff;border: 1px dotted black;border-radius: 0.25em;box-sizing: border-box;margin-bottom: 0.5em;}#sk-container-id-1 div.sk-estimator:hover {background-color: #d4ebff;}#sk-container-id-1 div.sk-parallel-item::after {content: \"\";width: 100%;border-bottom: 1px solid gray;flex-grow: 1;}#sk-container-id-1 div.sk-label:hover label.sk-toggleable__label {background-color: #d4ebff;}#sk-container-id-1 div.sk-serial::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: 0;}#sk-container-id-1 div.sk-serial {display: flex;flex-direction: column;align-items: center;background-color: white;padding-right: 0.2em;padding-left: 0.2em;position: relative;}#sk-container-id-1 div.sk-item {position: relative;z-index: 1;}#sk-container-id-1 div.sk-parallel {display: flex;align-items: stretch;justify-content: center;background-color: white;position: relative;}#sk-container-id-1 div.sk-item::before, #sk-container-id-1 div.sk-parallel-item::before {content: \"\";position: absolute;border-left: 1px solid gray;box-sizing: border-box;top: 0;bottom: 0;left: 50%;z-index: -1;}#sk-container-id-1 div.sk-parallel-item {display: flex;flex-direction: column;z-index: 1;position: relative;background-color: white;}#sk-container-id-1 div.sk-parallel-item:first-child::after {align-self: flex-end;width: 50%;}#sk-container-id-1 div.sk-parallel-item:last-child::after {align-self: flex-start;width: 50%;}#sk-container-id-1 div.sk-parallel-item:only-child::after {width: 0;}#sk-container-id-1 div.sk-dashed-wrapped {border: 1px dashed gray;margin: 0 0.4em 0.5em 0.4em;box-sizing: border-box;padding-bottom: 0.4em;background-color: white;}#sk-container-id-1 div.sk-label label {font-family: monospace;font-weight: bold;display: inline-block;line-height: 1.2em;}#sk-container-id-1 div.sk-label-container {text-align: center;}#sk-container-id-1 div.sk-container {/* jupyter's `normalize.less` sets `[hidden] { display: none; }` but bootstrap.min.css set `[hidden] { display: none !important; }` so we also need the `!important` here to be able to override the default hidden behavior on the sphinx rendered scikit-learn.org. See: https://github.com/scikit-learn/scikit-learn/issues/21755 */display: inline-block !important;position: relative;}#sk-container-id-1 div.sk-text-repr-fallback {display: none;}</style><div id=\"sk-container-id-1\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>RandomForestClassifier(n_estimators=60, random_state=0)</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item\"><div class=\"sk-estimator sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-1\" type=\"checkbox\" checked><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label sk-toggleable__label-arrow\">RandomForestClassifier</label><div class=\"sk-toggleable__content\"><pre>RandomForestClassifier(n_estimators=60, random_state=0)</pre></div></div></div></div></div>"
      ],
      "text/plain": [
       "RandomForestClassifier(n_estimators=60, random_state=0)"
      ]
     },
     "execution_count": 156,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 157,
   "id": "ec2b5aad",
   "metadata": {},
   "outputs": [],
   "source": [
    "prediction_ls = []\n",
    "# S主题-T主题\n",
    "path1 = r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\12S-T预测集.xlsx'\n",
    "# T主题-I主题\n",
    "path2 = r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\12T-I预测集.xlsx'\n",
    "# S主体-T主体\n",
    "path3 = r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\12主体S-T预测集.pkl'\n",
    "# T主体-I主体\n",
    "path4 = r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\12主体T-I预测集.xlsx'\n",
    "# T主题-I主体\n",
    "path5 = r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\12主题T-主体I预测集.xlsx'\n",
    "path_ls = [path1,path2,path3,path4,path5]\n",
    "for path in path_ls:\n",
    "    if 'xlsx' in path:\n",
    "        df = pd.read_excel(path)\n",
    "    if 'pkl' in path:\n",
    "        with open(path,'rb') as f:\n",
    "            df = pickle.load(f)\n",
    "    prediction_ls.append(df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 158,
   "id": "8aca6c62",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(199, 103)\n",
      "(389, 103)\n",
      "(677196, 103)\n",
      "(10018, 103)\n",
      "(432, 103)\n"
     ]
    }
   ],
   "source": [
    "for df in prediction_ls:\n",
    "    print(df.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 160,
   "id": "03518c9d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'F:\\\\work\\\\2024.8.5DK课题处理\\\\7个网络20250106\\\\处理\\\\4预测建模\\\\12主题T-主体I预测集.xlsx'"
      ]
     },
     "execution_count": 160,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "path"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 161,
   "id": "a8ef90b5",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  0%|                                                                                            | 0/5 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\12S-T预测集.xlsx\n",
      "(73, 3)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      " 40%|█████████████████████████████████▌                                                  | 2/5 [00:02<00:02,  1.13it/s]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\12T-I预测集.xlsx\n",
      "(52, 3)\n",
      "F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\12主体S-T预测集.pkl\n",
      "(62566, 3)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 60%|██████████████████████████████████████████████████▍                                 | 3/5 [01:35<01:26, 43.28s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\12主体T-I预测集.xlsx\n",
      "(615, 3)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "100%|████████████████████████████████████████████████████████████████████████████████████| 5/5 [01:37<00:00, 19.45s/it]"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\12主题T-主体I预测集.xlsx\n",
      "(89, 3)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "for i in tqdm(range(0,5)):\n",
    "    df = prediction_ls[i]\n",
    "    path = path_ls[i]\n",
    "    # 预测\n",
    "    pre_X = df.iloc[:,3:]\n",
    "    predict_pro = model.predict_proba(pre_X)\n",
    "    predict_pro_1 = [i[1] for i in predict_pro]\n",
    "    pre_data = pd.concat([df.iloc[:,:2], pd.DataFrame(predict_pro_1,columns=['链接概率'])],axis=1)\n",
    "    print(path)\n",
    "    print(pre_data[pre_data['链接概率'] > 0.5].shape)\n",
    "    # 保存\n",
    "    save_path = path.replace(r'.xlsx','.xlsx').replace(r'.pkl','.xlsx').replace(r'12','13').replace(r'预测集','预测结果')\n",
    "    pre_data.to_excel(save_path,index = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 116,
   "id": "891b5532",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 117,
   "id": "f1ea549c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "markdown",
   "id": "eaf339cf",
   "metadata": {},
   "source": [
    "## 大于0.5的筛选后连接"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "98203baa",
   "metadata": {},
   "source": [
    "- 筛选大于0.5"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 163,
   "id": "ed41f001",
   "metadata": {},
   "outputs": [],
   "source": [
    "base_root = r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模'"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 166,
   "id": "45aec7c0",
   "metadata": {},
   "outputs": [],
   "source": [
    "path_ls = [base_root + r'\\13S-T预测结果.xlsx',\n",
    "        base_root + r'\\13T-I预测结果.xlsx',\n",
    "        base_root + r'\\13主体S-T预测结果.xlsx',\n",
    "        base_root + r'\\13主体T-I预测结果.xlsx',\n",
    "        base_root + r'\\13主题T-主体I预测结果.xlsx']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 167,
   "id": "ba705058",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "['F:\\\\work\\\\2024.8.5DK课题处理\\\\7个网络20250106\\\\处理\\\\4预测建模\\\\13S-T预测结果.xlsx',\n",
       " 'F:\\\\work\\\\2024.8.5DK课题处理\\\\7个网络20250106\\\\处理\\\\4预测建模\\\\13T-I预测结果.xlsx',\n",
       " 'F:\\\\work\\\\2024.8.5DK课题处理\\\\7个网络20250106\\\\处理\\\\4预测建模\\\\13主体S-T预测结果.xlsx',\n",
       " 'F:\\\\work\\\\2024.8.5DK课题处理\\\\7个网络20250106\\\\处理\\\\4预测建模\\\\13主体T-I预测结果.xlsx',\n",
       " 'F:\\\\work\\\\2024.8.5DK课题处理\\\\7个网络20250106\\\\处理\\\\4预测建模\\\\13主题T-主体I预测结果.xlsx']"
      ]
     },
     "execution_count": 167,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "path_ls"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 177,
   "id": "56dbaff6",
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "need_df_ls = []\n",
    "for path in path_ls:\n",
    "    df = pd.read_excel(path)\n",
    "    need_df = df[df['链接概率'] > 0.5].reset_index(drop = True)\n",
    "    save_path = path.replace(r'.xlsx',r'-大于0.5.xlsx')\n",
    "    need_df.to_excel(save_path,index = False)\n",
    "    need_df_ls.append(need_df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 207,
   "id": "9427f3f9",
   "metadata": {},
   "outputs": [],
   "source": [
    "# S-T-I\n",
    "need_df_ls[0].columns = ['S','T','WEIGTH']\n",
    "need_df_ls[1].columns = ['T','I','WEIGTH']\n",
    "# 按照 'T' 列匹配合并\n",
    "merged_df = pd.merge(need_df_ls[0], need_df_ls[1], on='T', suffixes=('_ST', '_TI'))\n",
    "\n",
    "# 保留所需列并形成路径\n",
    "s_t_i = merged_df[['S', 'T', 'I', 'WEIGTH_ST', 'WEIGTH_TI']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 208,
   "id": "bccacabe",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(228, 5)"
      ]
     },
     "execution_count": 208,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s_t_i.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 196,
   "id": "e9fa17fb",
   "metadata": {},
   "outputs": [],
   "source": [
    "s_t_i.to_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\14STI主题路径.xlsx',index = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "181feb95",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "3df2c31c",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 204,
   "id": "0002e3e8",
   "metadata": {},
   "outputs": [],
   "source": [
    "# S-T-I主体\n",
    "need_df_ls[2].columns = ['paper','patent','WEIGTH']\n",
    "need_df_ls[3].columns = ['patent','product','WEIGTH']\n",
    "# 按照 'T' 列匹配合并\n",
    "merged_df = pd.merge(need_df_ls[2], need_df_ls[3], on='patent', suffixes=('_paper_patent', '_patent_product'))\n",
    "\n",
    "# 保留所需列并形成路径\n",
    "paper_patent_product = merged_df[['paper', 'patent', 'product', 'WEIGTH_paper_patent', 'WEIGTH_patent_product']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 206,
   "id": "c09585ee",
   "metadata": {},
   "outputs": [],
   "source": [
    "paper_patent_product.to_excel(r'F:\\work\\2024.8.5DK课题处理\\7个网络20250106\\处理\\4预测建模\\14STI主体路径.xlsx',index = False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 210,
   "id": "9f1c67bd",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(109864, 5)"
      ]
     },
     "execution_count": 210,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "paper_patent_product.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "66c012d5",
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "2ff7094e",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
